使用Blazor服务器、dotnet 5和实体框架核心,我成功地使用整数ID 定制了身份
例如
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 Id,但当使用整数时,会引发错误:
类型ApplicationUser不能用作泛型类型或方法"UserStore"中的类型参数"TUser"。没有从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:时出现运行时错误
{无法为"IdentityUserRole"创建DbSet,因为上下文的模型中不包括此类型。}
然而,我有一个自定义的用户角色:
public class ApplicationUserRole : IdentityUserRole<int>
{
public ApplicationUserRole() : base() { }
public bool IsSystemEssential { get; set; }
}
带有ApplicationDbContext:中的定义
public DbSet ApplicationUserRoles{get;set;}
已解决(暂时(
在查看了重载的继承选项后,您必须扩展如下:
public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, int, ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin, ApplicationUserToken, ApplicationRoleClaim>
{
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
}
}
这似乎奏效了。仍然需要检查所有角色和声明更新。
您可以按如下方式更改ApplicationUserStore
。
public class ApplicationUserStore : UserStore<ApplicationUser,IdentityRole<int>, ApplicationDbContext,int>
{
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
}
//...
}