Identity - VerifyHashedPassword 方法效果不佳
Identity - VerifyHashedPassword method does not work well
我在 ASP.NET Identity 和 EntityFramework 方面遇到了非常奇怪的问题。
我有一个登录表单,我从中收到用户名和密码。
然后我检查用户是否存在于数据库中。
之后,我调用 UserManager 的方法 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();
}
这对我有用。
您可以使用 UserManager 执行此操作,只要您能够异步执行此操作,非异步扩展方法至少对我来说已损坏,将 null 发送到 PasswordHasher 中的 hashedPassword 参数。异步执行:
await _userManager.ChangePasswordAsync(userId, oldPassword, newPassword);
我在 ASP.NET Identity 和 EntityFramework 方面遇到了非常奇怪的问题。 我有一个登录表单,我从中收到用户名和密码。 然后我检查用户是否存在于数据库中。 之后,我调用 UserManager 的方法 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();
}
这对我有用。
您可以使用 UserManager 执行此操作,只要您能够异步执行此操作,非异步扩展方法至少对我来说已损坏,将 null 发送到 PasswordHasher 中的 hashedPassword 参数。异步执行:
await _userManager.ChangePasswordAsync(userId, oldPassword, newPassword);