在ASP.NET Identity中,验证重置密码令牌在一种方法中失败,但在另一种方法下有效



在实际重置密码之前,我们正在尝试使用UserManager生成PasswordResetToken并对其进行验证。

第一种方法负责生成令牌,然后通过密码重置链接将令牌发送给用户
令牌的生成工作正常,之后验证时,VerifyUserTokenAsync返回true(行://var result = await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, token);

第二种方法是重置密码。我们没有使用UserManager.ResetPassword,因为我们的用户没有所有必需的字段。在该方法中调用VerfiyUserTokenAsync时,即使提供的令牌与第一个方法中的令牌完全相同,if也会返回false

我们无法理解为什么它在第一种方法中有效,但在第二种方法中失败
如有任何线索,我们将不胜感激。

提前感谢

[HttpPost("generatepasswordresettoken")]
[ProducesResponseType(StatusCodes.Status201Created)]
public async Task<IActionResult> GeneratePasswordResetToken([FromBody] ResetPasswordTokenRequest resetPasswordTokenRequest)
{
var user = await this.userService.GetAsync(resetPasswordTokenRequest.Email);
var token = await this.userManager.GeneratePasswordResetTokenAsync(user);
//var result = await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, token);
return this.Ok(new GenerateResetPasswordTokeResponse {ResetPasswordToken = token, Email = resetPasswordTokenRequest.Email});
}

[HttpPut("resetpassword")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordRequest resetPasswordRequest)
{
var user = await this.userService.GetAsync(resetPasswordRequest.Email);
if (await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, resetPasswordRequest.ResetPasswordToken)) {
var resetPasswordDomainModel = this.resetPasswordMapper.Map(resetPasswordRequest);
if (await this.userService.ResetPasswordAsync(resetPasswordDomainModel)) {
return this.Ok();
}
}
return this.BadRequest("Couldn't reset password");
}

每个SecurityToken应该只对一个操作有效,VerifyUserTokenAsync方法的这种行为是一个优势。否则,您需要编写一些代码来自行控制这种行为。在您的情况下,您可以生成新的令牌,然后将其传递给ResetPasswordAsync方法。

[HttpPut("resetpassword")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordRequest resetPasswordRequest)
{
var user = await this.userService.GetAsync(resetPasswordRequest.Email);
if (await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, resetPasswordRequest.ResetPasswordToken))
{
var newtoken = userManager.GeneratePasswordResetTokenAsync(user);
resetPasswordRequest.ResetPasswordToken = newtoken;
var resetPasswordDomainModel = this.resetPasswordMapper.Map(resetPasswordRequest);
if (await this.userService.ResetPasswordAsync(resetPasswordDomainModel))
{
return this.Ok();
}
}
return this.BadRequest("Couldn't reset password");
}

相关内容

最新更新