我陷入了类似这样的情景。
我正在使用我的新 MVC 应用程序实施 Identity 2.0 。我想使用用户ID 用户ID 作为 int 。
为实现这一目标,我创建了
自定义用户存储 - MyUserStore
public class MyUserStore : IUserLoginStore<AspNetUser>, IUserClaimStore<AspNetUser>, IUserRoleStore<AspNetUser>, IUserPasswordStore<AspNetUser>, IUserSecurityStampStore<AspNetUser>, IUserStore<AspNetUser>, IDisposable //where AspNetUser : AspNetUser
{
private readonly DemoPermissionDBContext _context;
//private readonly Func<string, string> _partitionKeyFromId;
public MyUserStore(DemoPermissionDBContext dbContext)
{
_context = dbContext;
}
public Task SetPasswordHashAsync(AspNetUser user, string passwordHash)
{
user.PasswordHash = passwordHash;
return Task.FromResult(0);
}
//And other methods implementation
}
此处 AspNetUser 是由EF生成的用户类,我将其继承自Identity.IUser
自定义用户管理器 - AppUserManager
public class AppUserManager : Microsoft.AspNet.Identity.UserManager<AspNetUser>
{
MyUserStore _store = null;
public AppUserManager(MyUserStore store) : base(store)
{
_store = store;
}
}
自定义密码哈希 - MyPasswordHasher
public class MyPasswordHasher : IPasswordHasher
{
public string HashPassword(string password)
{
return password;
}
public PasswordVerificationResult VerifyHashedPassword(
string hashedPassword, string providedPassword)
{
if (hashedPassword == HashPassword(providedPassword))
return PasswordVerificationResult.Success;
else
return PasswordVerificationResult.Failed;
}
}
自定义声明Prinicipal - AppClaimsPrincipal
public class AppClaimsPrincipal : ClaimsPrincipal
{
public AppClaimsPrincipal(ClaimsPrincipal principal):base(principal)
{
}
public int UserId
{
get { return int.Parse(this.FindFirst(ClaimTypes.Sid).Value);
}
}
现在,当我注册用户时, UserManager.CreateAsync 应该在将用户实际保存到数据库之前自动调用 SetPasswordHashAsync 。同时,正确调用 SetSecurityStampAsync 。
我在AccountController中的操作是这样的,
public AppUserManager UserManager { get; private set; }
public AccountController(AppUserManager userManager)
{
this.UserManager = userManager;
this.UserManager.PasswordHasher = new MyPasswordHasher();
}
这就是我如何为用户表和数据库第一种方法实现用户int主键的身份。
问题:
当我的用户插入数据库时,它没有包含密码哈希。该记录具有空密码哈希。当我调试代码时,我发现不会仅调用 SetPasswordHashAsync 。它没有执行menthod。什么应该导致这个问题?我已经逐行检查了整个代码但没有成功。在web.config中是否需要添加任何内容以使用自定义密码hasher?
我不确定我是否遗漏了什么。非常感谢任何帮助。
答案 0 :(得分:1)
我没有看到你在userManager中设置MyPasswordHasher
。添加
this.PasswordHasher = new MyPasswordHasher();
在AppUserManager
的构造函数中。
此外,您无需覆盖ClaimsPrincipal
即可获取UserId
。这可以通过User.Identity.GetUserId()
命名空间中的Microsoft.AspNet.Identity
获得。
此外,我发现在IPrincipal
上使用扩展方法更容易获取声明的值 - 比使用自定义主体类型更容易。
答案 1 :(得分:0)
应调用 steve16351 所述的UserManager.CreateAsync(user, password)
而不是UserManager.CreateAsync(user)
。
我最近遇到了与您完全相同的问题,并用UserManager.CreateAsync(user, password)
解决了这个问题。