Menggunakan server Blazor, dotnet 5 dan Entity Framework Core, saya telah berhasil mengkustomisasi Identitas menggunakan ID integer
e.g
public class ApplicationUser : IdentityUser<int>
{
[Required]
[MaxLength(50)]
public string FirstName { get; set; }
[Required]
[MaxLength(50)]
public string LastName { get; set; }
}
Saya sekarang ingin memperluas UserStore untuk login khusus guna menyimpan riwayat kata sandi untuk mencegah duplikasi. Cara yang terdokumentasi untuk melakukan hal ini tampaknya adalah:
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);
}
}
Ini berfungsi untuk Id GUID default tetapi ketika menggunakan bilangan bulat itu menimbulkan kesalahan:
Tipe ApplicationUser tidak dapat digunakan sebagai parameter tipe 'TUser' dalam tipe atau metode generik 'UserStore'. Tidak ada konversi referensi implisit dari ApplicationUser' ke 'Microsoft.AspNetCore.Identity.IdentityUser'.
Apa cara yang benar untuk melakukan ini?
Sunting:
Per @Yinqiu, dimodifikasi untuk ApplicationRole khusus menjadi
kelas publik ApplicationUserStore : UserStore‹ApplicationUser, ApplicationRole, ApplicationDbContext, int› {
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
}
Berhasil dibangun dan membuat pengguna tetapi memberikan kesalahan run time saat mencoba mengakses ApplicationUserManager.IsInRoleAsync:
{Tidak dapat membuat DbSet untuk 'IdentityUserRole' karena tipe ini tidak disertakan dalam model untuk konteksnya.}
Namun saya memiliki Peran Pengguna khusus:
public class ApplicationUserRole : IdentityUserRole<int>
{
public ApplicationUserRole() : base() { }
public bool IsSystemEssential { get; set; }
}
Dengan definisi di ApplicationDbContext :
public DbSet ApplicationUserRoles { dapatkan; mengatur; }