【问题标题】:ASP.NET Identity Password Reset TokenASP.NET 身份密码重置令牌
【发布时间】:2020-02-29 23:27:58
【问题描述】:

当我尝试重置密码时,我收到“无效令牌”

发送前的令牌: cBcZbiN8LO9 + aIVMbegaj1k5IYrJ3fBOKJ / WSH0NZZUgguSgWOFANoVOMp8y5b / 481AP / mpnusV1YlmXQ1zFQmi4S / 7xYMtRn3IeSIviEWmuxwPF8O41Y1pFQ1tF8GAaw5D4 / Y9 + olZvII / kh5W8RGn4JT9wrOz / qwtdnYXbYxmjp4i20mLzXWqs9ewVUKIo8FZ + 7mXP + sKYKk + e754tLw == P>

已收到令牌: cbczbin8lo9 + aivmbegaj1k5iyrj3fbokj / wsh0nzzuggusgwofanovomp8y5b / 481ap / mpnusv1ylmxq1zfqmi4s / 7xymtrn3iesiviewmuxwpf8o41y1pfq1tf8gaaw5d4 / Y9 + olzvii / kh5w8rgn4jt9wroz / qwtdnyxbyxmjp4i20mlzxwqs9ewvukio8fz + 7mxp + skykk + e754tlw == P>

如您所见,唯一的区别是,由于某种原因,生成时有大写字母并更改为小写,可能是由 HttpUtility.UrlEncode / HttpUtility.UrlDencode 操作引起的?

忘记密码:

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = HttpUtility.UrlEncode(code) }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", string.Format("Please reset your password by clicking <a href='{0}'>here</a>", callbackUrl));

重设密码

var code = HttpUtility.UrlDecode(model.Code);
var result = await UserManager.ResetPasswordAsync(user.Id, code, model.Password);

知道是什么原因造成的吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc asp.net-identity


    【解决方案1】:

    我尝试在我自己的一个类似项目中使用编码/解码,并且令牌按预期返回到控制器中。所以它不会在我的测试中产生同样的“错误”。

    话虽如此,您不需要自己对令牌进行编码,asp.net 会为您编码令牌字符串,并在再次收到它时通过回调 URL 对其进行解码。 直接使用令牌即可:

    var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
    

    在接收端,也不要解码。 (跳过此行) var code = HttpUtility.UrlDecode(model.Code);

    只需像这样将model.Code 直接传递给UserManager 方法,它应该可以正常工作。 asp.net 将为您处理编码。

    var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
    

    例子:

    原始令牌 oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn + 6O7FXqwz7NPyRyr80EA9LNjsv + BdCDsTHnJx9nkOpnb + vcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP / XytN8qu5d9EUIOUL5IT + 9snciG4SQNSp4 / x8T5m1wrLmblEyuvH8 / VAwX1S5V + cJpkK8fGSmHunzziwamxt1ERB7A == P>

    Url.Action 将对此进行编码并作为链接插入到电子邮件中 oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn%2B6O7FXqwz7NPyRyr80EA9LNjsv%2BBdCDsTHnJx9nkOpnb%2BvcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP%2FXytN8qu5d9EUIOUL5IT%2B9snciG4SQNSp4%2Fx8T5m1wrLmblEyuvH8%2FVAwX1S5V%2BcJpkK8fGSmHunzziwamxt1ERB7A%3D%3D P>

    区别 + /== 将被编码为 %2B(+) %2F(/) 和 %3D(=)

    在传递给控制器​​之前由 asp.net 解码 oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn + 6O7FXqwz7NPyRyr80EA9LNjsv + BdCDsTHnJx9nkOpnb + vcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP / XytN8qu5d9EUIOUL5IT + 9snciG4SQNSp4 / x8T5m1wrLmblEyuvH8 / VAwX1S5V + cJpkK8fGSmHunzziwamxt1ERB7A == P>

    与原始令牌相同。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 2015-02-21
      • 2017-09-10
      • 2014-07-06
      • 2017-06-02
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多