Ошибка InvalidToken при сбросе пароля с использованием ASP.NET Core Identity
Я использую ASP.NET Core Identity для управления пользователями в своем приложении. Сейчас я пытаюсь реализовать функционал сброса пароля. Я генерирую токен для сброса пароля и отправляю его пользователю. Однако, когда я использую полученный токен для сброса пароля, возникает ошибка InvalidToken. Вот соответствующая часть моего кода:
public async Task<string> GeneratePasswordResetTokenAsync(UserEntity user)
{
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
return token;
}
public async Task<ErrorOr<UserEntity>> ResetPasswordAsync(UserEntity user, string token, string password)
{
var resetPasswordResult = await _userManager.ResetPasswordAsync(user, token, password);
if (resetPasswordResult.Succeeded)
{
return user;
}
else
{
return Error.Validation(resetPasswordResult.Errors.FirstOrDefault()!.Description.ToString());
}
}
[HttpPost("reset-password")]
public async Task<IActionResult> ResetPasswordAsync([FromBody] ResetPasswordRequest request)
{
var resetPasswordResult = await _mediatr.Send(
_mapper.Map<ResetPasswordCommand>(request));
return resetPasswordResult.Match(
resetPasswordResult => Ok(),
errors => Problem(errors));
}
public record ResetPasswordRequest
{
[Required(ErrorMessage = "{PropertyName} must not be empty")]
[EmailAddress(ErrorMessage = "{PropertyValue} has wrong format")]
[Length(5, 254)]
public required string Email { get; init; }
[Required(ErrorMessage = "{PropertyName} must not be empty")]
[Length(256, 4096)]
public required string Token { get; init; }
[Required(ErrorMessage = "{PropertyName} must not be empty")]
[Length(8, 24)]
public required string Password { get; init; }
[Required(ErrorMessage = "{PropertyName} must not be empty")]
[Compare("Password",
ErrorMessage = "The password and confirmation password do not match.")]
[Length(8, 24)]
public required string ConfirmPassword { get; init; }
}
public virtual async Task<IdentityResult> ResetPasswordAsync(
TUser user,
string token,
string newPassword)
{
this.ThrowIfDisposed();
ArgumentNullThrowHelper.ThrowIfNull((object) user, nameof (user));
if (!await this.VerifyUserTokenAsync(user, this.Options.Tokens.PasswordResetTokenProvider, "ResetPassword", token).ConfigureAwait(false))
return IdentityResult.Failed(this.ErrorDescriber.InvalidToken());
IdentityResult identityResult = await this.UpdatePasswordHash(user, newPassword, true).ConfigureAwait(false);
return !identityResult.Succeeded ? identityResult : await this.UpdateUserAsync(user).ConfigureAwait(false);
}
public async Task<ErrorOr<Success>> SendResetPasswordEmailAsync(
string email, string token, string baseUrl, string userName)
{
string url = $"{baseUrl}/authentication/reset-password/{email}/{WebUtility.UrlEncode(token)}";
string emailBody = string.Empty;
using (StreamReader reader = new("./EmailTemplates/forgot-password.html"))
{
emailBody = reader.ReadToEnd();
}
emailBody = emailBody.Replace("{{ name }}", userName);
emailBody = emailBody.Replace("{{ url }}", url);
await _smtpService.SendEmailAsync(email, "Reset password", emailBody);
return Result.Success;
}
Информация по отладке:
Пароль: Qwerty123*
Токен: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ..."
Пользователь: [email protected]