Ошибка 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]

Ответы (0 шт):