核心代码:
// 生成重置密码令牌var token = await _userManager.GeneratePasswordResetTokenAsync(user);// 重置用户密码var result = await _userManager.ResetPasswordAsync(user, model.Token, model.Password);
找回密码 & 重置密码 完整代码:
#region 找回密码 & 重置密码[HttpGet]public IActionResult ForgotPassword(){return View();}[HttpPost]public async Task<IActionResult> ForgotPassword(EmailAddressViewModel model){if (ModelState.IsValid){// 通过邮件地址查询用户地址var user = await _userManager.FindByEmailAsync(model.Email);// 如果找到了用户并且确认了电子邮件if (user != null && await _userManager.IsEmailConfirmedAsync(user)){// 生成重置密码令牌var token = await _userManager.GeneratePasswordResetTokenAsync(user);// 生成密码重置链接var passwordResetLink = Url.Action("ResetPassword", "Account",new { email = model.Email, token = token }, Request.Scheme);// 将密码重置链接记录到文件中_logger.Log(LogLevel.Warning, passwordResetLink);// 重定向用户到忘记密码确认视图return View("ForgotPasswordConfirmation");}// 为了避免帐户穷举和暴力攻击,所以不进行用户不存在或邮箱未验证的提示return View("ForgotPasswordConfirmation");}return View(model);}// 电子邮箱,重置密码的 token,新密码,确认密码[HttpGet]public IActionResult ResetPassword(string token, string email){// 如果密码的 token 或者邮箱地址为空,用户有可能在试图篡改密码重置的 URLif (token == null || email == null){ModelState.AddModelError("", "当前的密码重置令牌无效");}return View();}[HttpPost]public async Task<IActionResult> ResetPassword(ResetPasswordViewModel model){if (ModelState.IsValid){// 通过电子邮件查找用户var user = await _userManager.FindByEmailAsync(model.Email);if (user != null){// 重置用户密码var result = await _userManager.ResetPasswordAsync(user, model.Token, model.Password);if (result.Succeeded){// 密码成功重置后,如果当前账户被锁定,则设置该账户锁定结束日期为当前 UTC 日期时间。// 这样用户就可以用新密码登录系统。if (await _userManager.IsLockedOutAsync(user)){// DateTimeOffset 指 UTC 时间即格林威治时间await _userManager.SetLockoutEndDateAsync(user, DateTimeOffset.UtcNow);}return View("ResetPasswordConfirmation");}// 告诉它验证不通过的错误信息foreach (var error in result.Errors){ModelState.AddModelError("", error.Description);}return View(model);}// 为了避免帐户穷举和暴力攻击,不要提示用户不存在return View("ResetPasswordConfirmation");}// 如果模型验证未通过,则显示验证错误return View(model);}#endregion 找回密码 & 重置密码
其他代码请参考 StudentManagement。
效果:

