【问题标题】:asp.net identity 3 - Reset password invalid tokenasp.net identity 3 - 重置密码无效令牌
【发布时间】:2020-02-10 13:38:40
【问题描述】:

我正在通过发送一封带有 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 行返回“无效令牌” 我已经检查了这一行中的令牌是否与生成的相同 var code = await _userManager.GeneratePasswordResetTokenAsync(user); 在第一篇文章中。

有人可以帮忙吗?

【问题讨论】:

    标签: token asp.net-identity-3 reset-password


    【解决方案1】:

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

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

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

    请注意,&lt;TUser&gt; 是您的 IdentityUser 课程。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2015-04-28
      • 2020-12-15
      • 2021-01-23
      • 2015-05-29
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      相关资源
      最近更新 更多