asp.net identity 3 - Неверный токен сброса пароля

Я настраиваю функцию сброса пароля, отправив электронное письмо со ссылкой для сброса с основным идентификатором asp.net 3.

Мой первый пост генерирует токен и тело электронной почты и отправляет электронное письмо.

1     [HttpPost("requestPasswordReset")]
2     [AllowAnonymous]
3     public async Task<IActionResult> requestPasswordReset(PasswordResetRequestDto passwordResetRequestDto)
4     {
5       var user = await _userManager.FindByNameAsync(passwordResetRequestDto.Username);
6 
7       if (user == null)
8         return Unauthorized();
9 
10      var code = await _userManager.GeneratePasswordResetTokenAsync(user);
11      code = System.Web.HttpUtility.UrlEncode(code);
12
13      // For test purpose: this works
14      var decodedCode = System.Web.HttpUtility.UrlDecode(code);
15      IdentityResult passwordChangeResult = await _userManager.ResetPasswordAsync(user, decodedCode, "password");
16      // End For test purpose
17
18      passwordResetRequestDto.EmailToSend.HtmlPart = passwordResetRequestDto.EmailToSend.HtmlPart.Replace("[resetLink]", passwordResetRequestDto.SpaUrl + "?token=" + code);
19
20      var jsonEmailToSend = JsonConvert.SerializeObject(passwordResetRequestDto.EmailToSend);
21      var data = new StringContent(jsonEmailToSend, Encoding.UTF8, "application/json");
22
23      var client = new HttpClient();
24
25      client.BaseAddress = new Uri(_config.GetSection("AppSettings:ApiUrl").Value + "email/sendmail");
26      var postEmail = client.PostAsync(client.BaseAddress, data);
27
28      return Ok();
29    }

Строки с 13 по 20 предназначены только для проверки возможности использования токена для сброса пароля. Строка 18 создает ссылку сброса на угловой клиент SPA.

Новый пароль вводится в SPA и отправляется в следующий пост для сброса пароля

1     [HttpPost("resetPassword")]
2     [AllowAnonymous]
3     public async Task<IActionResult> resetPassword(UserDto userDto)
4     {
5       var user = await _userManager.FindByNameAsync(userDto.Username);
6       var password = userDto.Password;
7       var token = userDto.Token;
8       token = System.Web.HttpUtility.UrlDecode(token);
9 
10      IdentityResult passwordChangeResult = await _userManager.ResetPasswordAsync(user, token, userDto.Password);
11
12      if (passwordChangeResult.Succeeded)
13        return Ok();
14
15      return BadRequest();
16    }

Строка 10 возвращает «недопустимый токен». Я проверил, что токен в этой строке тот же, что был сгенерирован var code = await _userManager.GeneratePasswordResetTokenAsync(user); в первом посте.

Кто-нибудь может помочь?


person user3438413    schedule 10.02.2020    source источник


Ответы (1)


Вызов .ResetPasswordAsync() обновит SecurityStamp пользователя, что означает, что все сгенерированные токены теперь недействительны.

В целях тестирования удалите вызов .ResetPasswordAsync() и используйте следующий код для проверки токена.

var isValidToken = await _userManager.VerifyUserTokenAsync(
    user,
    _userManager.Options.Tokens.PasswordResetTokenProvider,
    UserManager<TUser>.ResetPasswordTokenPurpose,
    code
);

Обратите внимание, <TUser> — это ваш IdentityUser класс.

person Neverever    schedule 23.06.2020