asp. net идентификатор 3 - сброс пароля неверный токен - PullRequest
0 голосов
/ 10 февраля 2020

Я настраиваю функцию сброса пароля, отправляя электронное письмо со ссылкой для сброса с 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 angular.

В 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.GeneratePasswordResetTokenAsyn c (user); в первом посте.

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

...