首页 > 解决方案 > 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 行构建到 Angular 客户端 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 行返回 'invalid token' 我检查了该行中的令牌与 var code = await _userManager.GeneratePasswordResetTokenAsync(user); 生成的令牌相同 在第一篇文章中。

有人可以帮忙吗?

标签: tokenasp.net-identity-3reset-password

解决方案


调用.ResetPasswordAsync()将更新用户的 SecurityStamp,这意味着生成的所有令牌现在都无效。

出于测试目的,请删除调用.ResetPasswordAsync()并使用以下代码验证令牌。

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

请注意,<TUser>是你的IdentityUser课。


推荐阅读