Расширение EF Core Identity UserStore с помощью целочисленного идентификатора пользователя

Используя сервер Blazor, dotnet 5 и Entity Framework Core, я успешно настроил удостоверение с использованием целочисленных идентификаторов.

e.g

public class ApplicationUser : IdentityUser<int>
{
    [Required]
    [MaxLength(50)]
    public string FirstName { get; set; }

    [Required]
    [MaxLength(50)]
    public string LastName { get; set; }
}

Теперь я хочу расширить UserStore для пользовательского входа в систему для хранения истории паролей, чтобы предотвратить дублирование. Документированный способ сделать это выглядит следующим образом:

public class ApplicationUserStore : UserStore<ApplicationUser>
{
    public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
    {
    }

    public override async Task<IdentityResult> CreateAsync(ApplicationUser appUser)
    {
        await base.CreateAsync(appUser);
        await AddToUsedPasswordAsync(appUser, appUser.PasswordHash);
    }

    public Task AddToUsedPasswordAsync(ApplicationUser appuser, string userpassword)  
    {  
        appuser.UserUsedPassword.Add(new UsedPassword() { UserID = appuser.Id, HashPassword = userpassword });  
        return UpdateAsync(appuser);  
    } 
} 

Это работает для идентификатора GUID по умолчанию, но при использовании целого числа выдает ошибку:

Тип ApplicationUser нельзя использовать в качестве параметра типа TUser в универсальном типе или методе UserStore. Неявное преобразование ссылки из ApplicationUser в Microsoft.AspNetCore.Identity.IdentityUser отсутствует.

Как правильно это сделать?

РЕДАКТИРОВАТЬ:

Per @Yinqiu, измененный для пользовательской ApplicationRole на

открытый класс ApplicationUserStore: UserStore ‹ApplicationUser, ApplicationRole, ApplicationDbContext, int› {

    public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
    {
    }

Создает успешно и создает пользователей, но выдает ошибку времени выполнения при попытке доступа к ApplicationUserManager.IsInRoleAsync:

{Невозможно создать DbSet для IdentityUserRole, потому что этот тип не включен в модель для контекста.}

Однако у меня есть особая роль пользователя:

public class ApplicationUserRole : IdentityUserRole<int>
{
    public ApplicationUserRole() : base() { }

    public bool IsSystemEssential { get; set; }

}

С определением в ApplicationDbContext:

общедоступный DbSet ApplicationUserRoles {получить; установленный; }


person MaxTheCoder    schedule 14.04.2021    source источник
comment
Привет, @ MaxTheCoder, есть обновления?   -  person Yinqiu    schedule 16.04.2021
comment
Это не форум, просьба не добавлять ответы на вопросы. Опубликуйте ответ, если хотите указать, что нашли ответ, отличный от того, который уже был опубликован.   -  person Camilo Terevinto    schedule 17.04.2021


Ответы (2)


Вы можете изменить свой ApplicationUserStore следующим образом.

public class ApplicationUserStore : UserStore<ApplicationUser,IdentityRole<int>, ApplicationDbContext,int>
{
    public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
    {
    }
    //...
}
person Yinqiu    schedule 15.04.2021
comment
Я также настроил роли, поэтому ваше предложение работает со следующей модификацией: открытый класс ApplicationUserStore: UserStore ‹ApplicationUser, ApplicationRole, ApplicationDbContext, int›. Однако при вызове IsInRole я получаю следующую ошибку: Невозможно создать DbSet для IdentityUserRole ‹int›, потому что этот тип не включен в модель для контекста.} - person MaxTheCoder; 17.04.2021

РЕШЕНО (предварительно)

Посмотрев на перегруженные параметры наследования, вы должны расширить их следующим образом:

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, int, ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin, ApplicationUserToken, ApplicationRoleClaim>
{
    public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
    {
    }
}

Кажется, это работает. По-прежнему необходимо проверить все обновления ролей и заявок.

person MaxTheCoder    schedule 17.04.2021