Memperluas EF Core Identity UserStore dengan ID pengguna bilangan bulat

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; }


person MaxTheCoder    schedule 14.04.2021    source sumber
comment
Hai @MaxTheCoder, ada pembaruan?   -  person Yinqiu    schedule 16.04.2021
comment
Ini bukan forum, mohon jangan menambahkan solusi pada pertanyaan. Posting jawaban jika Anda ingin menunjukkan bahwa Anda menemukan jawaban selain yang sudah diposting   -  person Camilo Terevinto    schedule 17.04.2021


Jawaban (2)


Anda dapat mengubah ApplicationUserStore Anda sebagai berikut.

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
Saya juga telah menyesuaikan Peran, jadi saran Anda berfungsi dengan modifikasi berikut: kelas publik ApplicationUserStore : UserStore‹ApplicationUser, ApplicationRole, ApplicationDbContext, int›. Namun, saya kemudian mendapatkan kesalahan berikut saat memanggil IsInRole : Tidak dapat membuat DbSet untuk 'IdentityUserRole‹int›' karena tipe ini tidak disertakan dalam model untuk konteksnya.} - person MaxTheCoder; 17.04.2021

TERSELESAIKAN (sementara)

Setelah melihat opsi warisan yang kelebihan beban, Anda harus memperluasnya sebagai berikut:

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

Ini sepertinya berhasil. Masih perlu memeriksa semua pembaruan peran dan klaim.

person MaxTheCoder    schedule 17.04.2021