当我使用usermanager生成密码重置令牌时,一旦将其传递给剃刀视图,令牌就会发生变化。
一个例子是:
var resetToken = await userManager.GeneratePasswordResetTokenAsync(userId);
if (registerSuccess)
{
var model = new ResetModel { Token = resetToken, UserId = userId };
return this.View(model);
}
我可以在调试时看到重置令牌的值是
AQAAANCMnd8BFdERjHoAwE / CL + sBAAAAmfrU4hd3Q0WLiANC7DsekQAAAAACAAAAAAADZgAAwAAAABAAAAB1Q / FgOVgsh + 0SsLLYSKrFAAAAAASAAACgAAAAEAAAAFMVfXSy24PLGHSoIqFO / YRAAAAAYll / 7E8QwrH5JEfhMKGVHNe4CZM3TFWVL4lRE7Jhm / I6CKkTdloHofac054Ergy7BtwtV9OM7ila3f / ti90iDBQAAABAfR8pdGZ2eBXq / sGw0qVP6PQlWg ==
但是一旦在视图上呈现它已经变为
AQAAANCMnd8BFdERjHoAwE / CL + sBAAAAmfrU4hd3Q0WLiANC7DsekQAAAAACAAAAAAADZgAAwAAAABAAAACDU0qQzkc65kQa58ift5NBAAAAAASAAACgAAAAEAAAAGGy5Flp6xtR7cGZkvRoNNpAAAAAha1iP7uXqD6KSKbWBOfdXM1KaZnOekiYTSad6 / zkejoCk5cDd1FK / JdxKS0Rx9rHeqTJpZkzeEmh5HI3 // cLixQAAAAJFOivgVuhoOXTMZMeY + AlLzmifQ ==
视图代码如下:
@Html.HiddenFor(x => x.Token)
我完全失去了什么。有谁知道发生了什么?为什么令牌在渲染到视图后会发生变化?
答案 0 :(得分:2)
如果将令牌传递给网址,则需要为令牌添加Url-Encoding:
var resetToken = await userManager.GeneratePasswordResetTokenAsync(userId);
resetToken = System.Web.HttpUtility.UrlEncode(resetToken);
否则浏览器会混淆令牌中可能出现的特殊符号。
如果您在视图中打印,则需要通过Html.Raw
关闭HtmlEncoding:
<input type="hidden" value="@Html.Raw(Model.Token)" name="Token" />