c# – Identity – VerifyHashedPassword方法不能正常工作

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

这对我有用.

点赞