如何检查密码重置令牌是否过期



我正在使用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);
}

我注意到,重置密码页面的唯一验证是检查代码是否为null,而不是检查其是否仍然有效还是未过期。

[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)

我希望能够验证代码在键入重置密码页面以向用户显示消息时,而不是在他们尝试重置密码后仍然有效。

有没有办法检查是否有效?

以下代码可以验证重置令牌是否有效:

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/istentity/blob/rel/2.0.0.0/src/microsoft.extensions.identity.core.core/usermanager.cs#l29

如果您检查了UserManager.ResetPasswordAsync(...)方法,请将Throug跟踪到VerifyUserTokenAsync方法,该方法只能进行:

// Make sure the token is valid
var result = await _tokenProviders[tokenProvider].ValidateAsync(purpose, token, this, user);

您也可以自己做这件事,知道:

  • 您可以为您的情况询问令牌提供商的DI框架(例如,通过您的控制器构造函数);
  • purpose只是硬编码的"ResetPassword"字符串;
  • token是用户使用的代码;
  • user您应该能够根据您的视图,电子邮件,URL和设置的任何内容来获得(默认示例我认为不涵盖此问题,但是您可以轻松地将user.Id放在"中。忘记密码URL"在令牌本身之前,并在需要时提取它)。

然后,您可以自己调用ValidateAsync并相应地调整视图。

相关内容

  • 没有找到相关文章

最新更新