ASP.NET身份更改密码验证否定错误

时间:2016-10-06 21:44:10

标签: asp.net asp.net-mvc asp.net-identity

我正在使用ASP.NET MVC +实体框架和身份

我正在撕扯我的头发因为大约10%的用户在更改密码时遇到问题。我主要使用项目代的股票代码。唯一的变化是用户重定向,具体取决于登录成功后的角色

大多数用户都有改变密码的无缝体验,但对于大约10%的用户,当他们点击提交时,会给他们一个错误,即密码不正确。

事实证明它实际上已经更新了密码,但由于错误消息,他们继续尝试使用原始密码。我无法在我的开发机器上复制它来进行调试,但我在客户的实践中看到了它

任何人都可以看到代码的任何问题或之前遇到过这种情况吗?

    [Authorize(Roles = "Administrator, ...")]
    public ActionResult ChangePassword()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize(Roles="Administrator", ...)]
    public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
        if (result.Succeeded)
        {
            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
            if (user != null)
            {
                await SignInManager.SignInAsync(user, isPersistent: true, rememberBrowser: false);
            }

            if (User.IsInRole("Admin"))
            {
                return RedirectToAction("Index", "Dashboard", new      Area="Admin"});
            }

                // if all else fails redirect the user back to the default web site.
            return Redirect("http://www.example.com");
        }
        AddErrors(result);
        return View(model);
    }

编辑 - 以下评论如下。它们是自动生成的样板代码:

public class ChangePasswordViewModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm new password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

用户和密码在代码中设置:

String password = "password";
String username = "user1";
var user = new ApplicationUser
{
        UserName = username,
        Email = "useremail.com",
};
var result = UserManager.Create(user, password);
if (result == IdentityResult.Success)
{
    UserManager.AddToRole(user.Id, "Admin");
}

1 个答案:

答案 0 :(得分:1)

这可能更适合作为评论,但格式化会让我疯狂,所以我会把它放在这里。以下内容应该在OWIN管道中启用额外的日志记录。

<system.diagnostics>
  <switches>
    <add name="Microsoft.Owin" value="Verbose" />
  </switches>
</system.diagnostics>

如果这显示不够或不适合您,请查看以下帖子,其中添加了更多内容:here