Identity - VerifyHashedPassword方法不能很好地工作
问题描述:
我对ASP.NET Identity和EntityFramework有一个很奇怪的问题。 我有一个登录表单,我从中接收用户名和密码。 然后我检查用户是否存在于数据库中。 之后我调用UserManager的方法VerifyHashedPassword来验证来自数据库的用户密码和来自表单的用户密码是否相同。一切正常,但对于数据库中的一些用户,该方法给我的结果是给定的密码和散列的密码是不一样的(但他们实际上是)。我只是想不通为什么一些用户的密码验证失败。Identity - VerifyHashedPassword方法不能很好地工作
这是我的代码。
public async Task<User> FindUserAsync(string userName, string password)
{
User user;
if (password != null)
{
user = await _userManager.FindByNameAsync(userName);
if (user == null)
{
user = await _userManager.FindByEmailAsync(userName);
}
var result = _userManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, password);
if (!(result == PasswordVerificationResult.Success))
{
return null;
}
}
return user;
}
答
好了,问题是在我的身边。
问题出现在某些用户决定更改密码时。 如果用户更改密码,我首先删除密码,然后将新密码添加到数据库。这非常愚蠢,因为我删除密码的数据库事务成功提交,但添加新密码的事务(由于某种原因)从未成功完成。
其实我使用这两种方法时,密码被更改:
await _userManager.RemovePasswordAsync(appUser.Id);
await _userManager.AddPasswordAsync(appUser.Id, fbUser.Password);
现在我是做手工:
String hashedNewPassword = _userManager.PasswordHasher.HashPassword(fbUser.Password);
if (hashedNewPassword != null)
{
appUser.PasswordHash = hashedNewPassword;
_context.Entry(appUser).State = EntityState.Modified;
await _context.SaveChangesAsync();
}
这对我的作品。
我假设你正在使用System.Web.Helpers Crypto.VerifyHashPassword ...检查user.PasswordHash是一个RFC 2898散列值,作为base-64编码的字符串。另请阅读http://stackoverflow.com/questions/20621950/asp-net-identity-default-password-hasher-how-does-it-work-and-is-it-secure看起来验证不是问题这里。 –
我猜这里的主要问题是,你如何哈希密码? PasswordHasher()? –
我以这种方式散列密码:_userManager.PasswordHasher.HashPassword(password); – Zedx