【问题标题】:ASP.NET Identity Change Password Validation False NegativeASP.NET 身份更改密码验证假阴性
【发布时间】:2016-10-06 21:44:10
【问题描述】:

我正在使用 ASP.NET MVC + Entity Framework 和 Identity

因为我的大约 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)在代码中添加一些日志记录。在 ChangePasswordAsync 和 ChangePassword 方法中,在每个 if 语句中,记录不同的消息。确保您的日志具有用户 ID,以便下次有人遇到问题时,您可以跟踪特定用户的日志中的事件。此外,请检查您是否在服务器上缓存凭据。如果是这样,那么问题可能是您的缓存与新数据不同步
  • 显示ChangePasswordViewModel 的代码和用户首先创建密码的模型代码。我怀疑在一个地方密码中允许使用像 &lt; 这样的特殊字符,但在另一个地方不允许使用。

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


【解决方案1】:

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

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

此外,如果这显示不够或对您不起作用,请查看以下帖子,其中添加了更多内容:here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多