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

我假设你正在使用System.Web.Helpers Crypto.VerifyHashPassword ...检查user.PasswordHash是一个RFC 2898散列值,作为base-64编码的字符串。另请阅读http://*.com/questions/20621950/asp-net-identity-default-password-hasher-how-does-it-work-and-is-it-secure看起来验证不是问题这里。 –

+0

我猜这里的主要问题是,你如何哈希密码? PasswordHasher()? –

+0

我以这种方式散列密码:_userManager.PasswordHasher.HashPassword(password); – Zedx

好了,问题是在我的身边。

问题出现在某些用户决定更改密码时。 如果用户更改密码,我首先删除密码,然后将新密码添加到数据库。这非常愚蠢,因为我删除密码的数据库事务成功提交,但添加新密码的事务(由于某种原因)从未成功完成。

其实我使用这两种方法时,密码被更改:

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

这对我的作品。