Создание аутентификации JWT без использования IdentityUser (и IdentityRoles) в .NET Core API 5

Прошло 2-3 дня, когда я возился с аутентификацией JWT в .NET Core API без каких-либо значительных успехов и не нашел ничего, что соответствовало бы моим потребностям. На самом деле я работаю над внедрением API поверх существующей базы данных. Итак, у меня уже есть существующий пользовательский класс, который настроен и настроен с помощью dbContext с EF Core.

Я не хочу наследовать IdentityUser в этом классе. Причина в том, что старое приложение работает в базе данных, и оно должно иметь возможность аутентифицироваться без прохождения через мой API. Короче говоря, я не могу изменять какие-либо поля или добавлять таблицы по соображениям совместимости. Например, вот моя пользовательская таблица, уже содержащая поля с именами UserMail, Username и RoleId.

public class MyCustomUser {
        public int UserId { get; set; }
        public string Username { get; set; }
        public byte[] Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserMail { get; set; }
        public int RoleId { get; set; }
        // [...]
}

Чего я не хочу:

public class MyCustomUser: IdentityUser {
        public int UserId { get; set; }
        public string Username { get; set; } // Conflict
        public byte[] Password { get; set; } // Conflict
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserMail { get; set; } // Conflict
        public int RoleId { get; set; } // Issue
        
        // What will appear in base
        // ---------------------------------------------------
        public virtual string UserName { get; set; }
        public virtual string NormalizedUserName { get; set; }
        [ProtectedPersonalData]
        public virtual string Email { get; set; }
        public virtual string NormalizedEmail { get; set; }
        [PersonalData]
        public virtual bool EmailConfirmed { get; set; }
        public virtual string PasswordHash { get; set; }
}

Есть ли способ добавить IdentityUser с настраиваемыми полями. То есть:

public void ConfigureServices(IServiceCollection services)
{
       services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyCustomDbContext>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

       services.AddIdentity<MyCustomUser, MyCustomRole>();
       // [...]
}

Я считаю, что моя проблема заключается скорее в нехватке ресурсов по этому вопросу, поскольку вся информация, которую я нашел в Интернете на сегодняшний день, использовала совершенно новый IdentityUser.

Некоторые ресурсы, на которые я смотрел, не совсем отвечая на мой вопрос:


person Samuel Montambault    schedule 19.03.2021    source источник
comment
JWT идеально подходит для создания вне вашего приложения... Вы думали об этом? Аутентифицировать и получить токен на сервере/API A и использовать его на сервере/API B? таким образом, вам не нужно изменять базу данных в существующем приложении.   -  person Stefan    schedule 19.03.2021
comment
Не подумал об этом спасибо за быстрый ответ! Однако в моей ситуации старое приложение, которое использовало БД, является приложением администратора, которое должно иметь возможность изменять роли и пользовательские настройки. Если я отделю jwt от существующей схемы, учетные данные пользователя не будут совпадать между двумя версиями.   -  person Samuel Montambault    schedule 19.03.2021
comment
Вы все еще можете изменить старое приложение? Потому что сопоставление с ролями можно настроить.   -  person Stefan    schedule 19.03.2021