Используя сервер 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 {получить; установленный; }