token - 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); 生成的令牌相同 在第一篇文章中。
有人可以帮忙吗?
解决方案
调用.ResetPasswordAsync()
将更新用户的 SecurityStamp,这意味着生成的所有令牌现在都无效。
出于测试目的,请删除调用.ResetPasswordAsync()
并使用以下代码验证令牌。
var isValidToken = await _userManager.VerifyUserTokenAsync(
user,
_userManager.Options.Tokens.PasswordResetTokenProvider,
UserManager<TUser>.ResetPasswordTokenPurpose,
code
);
请注意,<TUser>
是你的IdentityUser
课。
推荐阅读
- visual-studio - 对本地项目执行 U-SQL 应用程序脚本时引用程序集
- angular - 如何在 Classic CKEditor 5 中添加滚动条?
- r - 如何删除之前在组中找到值的行
- gradle - “Android Gradle”在哪里可以找到 gradle 文件中大量变量的定义和/或代码?
- regex - 用于在 Notepad++ 中替换字母数字字符的正则表达式
- c++ - 如何将具有抽象类类型的变量转换为其子类?
- nlp - 如何计算文本分类中的困惑度?
- c# - 为什么 MSDN 建议添加和删除链表节点以修改其值?
- logstash - Logstash - 多个 grok 模式不能一起工作
- json - 如何在 Flutter 的轮播(滑块)中显示 JSON 文件中的图像