我也遇到了这个。为了修复它,我在AccountController.cs
(和相应的视图)中创建了一些控制器操作来处理它。
以下是重置用户密码的实际行:
[AllowAnonymous]
[HttpPost]
public ActionResult ResetForgottenPassword(string key, ManageUserViewModel model)
{
var user = db.Users.SingleOrDefault(u => u.ForgotPasswordCode != null && u.ForgotPasswordCode == key);
if (user == null || !user.ForgotPasswordDate.HasValue || user.ForgotPasswordDate.Value.AddDays(1) < DateTime.UtcNow)
return new HttpUnauthorizedResult();
ModelState state = ModelState["OldPassword"];
if (state != null)
{
state.Errors.Clear();
}
if (ModelState.IsValid)
{
if (UserManager.HasPassword(user.Id))
UserManager.RemovePassword(user.Id);
IdentityResult result = UserManager.AddPassword(user.Id, model.NewPassword);
if (result.Succeeded)
{
//Clear forgot password temp key
user.ForgotPasswordCode = null;
user.ForgotPasswordDate = null;
db.SaveChanges();
//Sign them in
var identity = UserManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);
return RedirectToAction("Manage", new { Message = ManageMessageId.SetPasswordSuccess });
}
else
{
AddErrors(result);
}
}
ViewBag.ForgotPasswordCode = key;
return View(model);
}
一些自定义项是用户对象上的新字段:
ForgotPasswordCode
并ForgotPasswordDate
在整个“重置密码电子邮件”过程中跟踪用户。
ViewBag
一旦用户从电子邮件链接到达,我就会将密钥传递进去。
- 该
db
变量是从基本控制器继承的我的数据库上下文类的属性。
- 我在我的数据库中使用 UTC 日期时间。如果不这样做,请更改
DateTime.UtcNow
为。DateTime.Now
可能不是最好的解决方案,但它是一个相当快速和简单的补丁。