【发布时间】: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的代码和用户首先创建密码的模型代码。我怀疑在一个地方密码中允许使用像<这样的特殊字符,但在另一个地方不允许使用。
标签: asp.net asp.net-mvc asp.net-identity