我正在使用ASP.NET身份,我已经有了基本的忘记密码/重置密码功能。
当您填写忘记密码的表单时,会使用_userManager.GeneratePasswordResetTokenAsync(user)
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(model.Email);
if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
{
return View("ForgotPasswordConfirmation");
}
var code = await _userManager.GeneratePasswordResetTokenAsync(user);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
await _emailSender.SendEmailAsync(model.Email, "Reset Password",
$"Please reset your password by clicking here: <a href='{callbackUrl}'>link</a>");
return View("ForgotPasswordConfirmation");
}
// If we got this far, something failed, redisplay form
return View(model);
}
我注意到重置密码页面唯一的验证是检查代码是否为空,而不是检查它是否仍然有效或未过期。
[HttpGet]
[AllowAnonymous]
public IActionResult ResetPassword(string code = null)
{
if (code == null)
{
throw new Exception("A code must be supplied for password reset.");
}
var model = new ResetPasswordViewModel { Code = code };
return View(model);
}
在您尝试重置密码并调用_userManager.ResetPasswordAsync(user, model.Code, model.Password)
我希望能够验证代码在点击“重置密码”页面时是否仍然有效,以便向用户显示消息,而不是在他们尝试重置密码后。
有没有办法检查它是否有效?
答案 0 :(得分:4)
如果您检查UserManager.ResetPasswordAsync(...)
方法,请通过VerifyUserTokenAsync
方法进行跟踪,该方法只是:
// Make sure the token is valid
var result = await _tokenProviders[tokenProvider].ValidateAsync(purpose, token, this, user);
你也可以自己做,知道:
purpose
只是the hardcoded "ResetPassword"
string; token
是用户正在使用的代码; user
(默认示例不包含此内容我认为,但您可以轻松将user.Id
放入&#34;忘记密码网址&#34;在令牌本身之前,并在需要时将其解压缩。)然后您可以自己致电ValidateAsync
并相应地调整视图。
答案 1 :(得分:3)
以下代码用于验证重置令牌是否有效:
<强> 1。创建代码并将其发送给用户
var code = await this._userManager.GeneratePasswordResetTokenAsync(user);
<强> 2。验证令牌
[HttpGet]
public async Task<IActionResult> ResetPassword(string UserId, string token)
{
...
ApplicationUser user = //get user;
if(!await this._userManager.VerifyUserTokenAsync(user,this._userManager.Options.Tokens.PasswordResetTokenProvider, "ResetPassword", token)){
ViewBag.Message = this._localizer["tokenNotValid"].Value;
}
...
}
请参阅UserManager代码:https://github.com/aspnet/Identity/blob/rel/2.0.0/src/Microsoft.Extensions.Identity.Core/UserManager.cs#L29