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

问题描述 投票:4回答:2

我正在使用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)之前,它实际上并未检查令牌是否有效

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

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

c# asp.net-core asp.net-identity
2个回答
4
投票

如果你检查qazxsw poi方法,追溯到qazxsw poi方法,它只是:

UserManager.ResetPasswordAsync(...)

你也可以自己做,知道:

  • 您可以向DI框架(例如,通过您的控制器构造函数)询问您的情况的令牌提供程序;
  • VerifyUserTokenAsync只是// Make sure the token is valid var result = await _tokenProviders[tokenProvider].ValidateAsync(purpose, token, this, user); ;
  • purpose是用户使用的代码;
  • the hardcoded "ResetPassword" string你应该能够得到你的视图,电子邮件,网址和任何设置(默认示例不包括我想的,但你可以很容易地把token放在“忘记密码网址” “在令牌本身之前,并在需要时提取它”。

然后你可以自己调用user并相应地调整视图。


3
投票

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

1.创建代码并将其发送给用户

user.Id

2.验证令牌

ValidateAsync

请参阅UserManager代码:var code = await this._userManager.GeneratePasswordResetTokenAsync(user);

© www.soinside.com 2019 - 2024. All rights reserved.