entity-framework-5 – ASP.NET Identity:UserManager.PasswordHasher.VerifyHashedPassword一直失败

我正在使用ASP.NET Identity 2和Entity Framework 5(因为我们的Oracle数据提供程序不支持EF6).由于某种原因,通过UserManager.PasswordHasher.VerifyHashedPassword验证密码会导致失败.

我的UserStore类包含:

    public Task SetPasswordHashAsync(IccmUser user, string passwordHash)
    {
        IPasswordHasher hasher = new PasswordHasher();

        var t = Task.Run(() => {
            user.PasswordHash = hasher.HashPassword(passwordHash);
        });
        return t;
    }

(明显散列的)密码存储在数据库中.因此,这段代码似乎工作正常.

我的AccountController执行密码验证,如下所示:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(SignInModel model, string returnUrl)
    {
        if (ModelState.IsValid) {
            // This fails:
            //var user = await UserManager.FindAsync(model.UserName, model.Password);

            // Thus: do it step by step.
            PasswordVerificationResult result = PasswordVerificationResult.Failed;

            // Step 1: find user.
            IccmUser user = await UserManager.FindByNameAsync(model.UserName);
            if (user == null) {
                ModelState.AddModelError("", "Couldn't find the user.");
            } else {
                // Step 2: validate password
                result = UserManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, model.Password);
                if (result != PasswordVerificationResult.Success) {
                    ModelState.AddModelError("", "The password is not valid.");
                } else {
                    // Step 3: sign-in user.
                    await SignInAsync(user, model.RememberMe);
                    return Redirect(returnUrl);
                }
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

步骤2中的VerifyHashedPassword()始终返回Failed.两个参数(PasswordHash和Password)都正确传递.

我非常感谢任何指向我缺少的东西.

最佳答案 错误发生在UserStore实现中. SetPasswordHashAsync()不应该散列密码.相反,它从UserManager.CreateAsync()接收哈希密码.因此,UserStore中的以下更改可以解决问题:

    public Task SetPasswordHashAsync(IccmUser user, string passwordHash)
    {
        return Task.FromResult(user.PasswordHash = passwordHash);
    }

对不起噪音.

点赞