我使用的是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");
}
这可能更适合作为注释,但格式会让我发疯,所以我打算把它放在这里。下面的代码将在OWIN管道中启用额外的日志记录。
<system.diagnostics>
<switches>
<add name="Microsoft.Owin" value="Verbose" />
</switches>
</system.diagnostics>
如果这还不够,或者不适合你,看看下面的帖子,它添加了更多的东西:这里