我正在使用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");
}
答案 0 :(得分:1)
这可能更适合作为评论,但格式化会让我疯狂,所以我会把它放在这里。以下内容应该在OWIN管道中启用额外的日志记录。
<system.diagnostics>
<switches>
<add name="Microsoft.Owin" value="Verbose" />
</switches>
</system.diagnostics>
如果这显示不够或不适合您,请查看以下帖子,其中添加了更多内容:here