ASP.NET身份密码重置令牌

时间:2019-11-04 15:57:49

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

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

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

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

如您所见,唯一的区别是由于某种原因,在生成大写字母并将其更改为小写字母时,可能是由于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);

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

谢谢

1 个答案:

答案 0 :(得分:0)

我尝试在我自己的类似项目中使用编码/解码,并且令牌按预期的方式回到了控制器中。因此,在我的测试中不会产生相同的“错误”。

话虽如此,您无需自己编码令牌,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 ==

网址操作将对此进行编码,并作为链接插入到电子邮件中 oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn%2B6O7FXqwz7NPyRyr80EA9LNjsv%2BBdCDsTHnJx9nkOpnb%2BvcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP%2FXytN8qu5d9EUIOUL5IT%2B9snciG4SQNSp4%2Fx8T5m1wrLmblEyuvH8%2FVAwX1S5V%2BcJpkK8fGSmHunzziwamxt1ERB7A%3D%3D

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

由asp.net解码,然后传递给控制器​​ oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn + 6O7FXqwz7NPyRyr80EA9LNjsv + BdCDsTHnJx9nkOpnb + vcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP / XytN8qu5d9EUIOUL5IT + 9snciG4SQNSp4 / x8T5m1wrLmblEyuvH8 / VAwX1S5V + cJpkK8fGSmHunzziwamxt1ERB7A ==

与原始令牌相同。