我正在尝试实现密码重置功能。我使用ASP.NET身份。
我正在使用UserManager.GetConfirmationToken
返回如下标记:
UW / cj4xUj08kiGCntnWs7z1eUcWlyfNczH5IZfvf0ScTi4L1jgdkkus / Zb5ROJOWb%2b1XAVRSiBUvVGnESfEyauDDa4u%2bPDUH6D / CIpwPcFYRvLi%2B%2bq6f%2bRIhKHRTsGMV0y8lXpSZ5VqySWGSSaW9kofGage / IjW4HrvONeEtA4Szov3u7HgmqEUf0yzgivJ0
然后,我撰写我的网址,然后通过电子邮件将其发送给注册用户。激活帐户的网址如下:
http://localhost:4322/Account/Confirm/UW/cj4xUj08kiGCntnWs7z1eUcWlyfNczH5IZfvf0ScTi4L1jgdkkus/Zb5ROJOWb%2b1XAVRSiBUvVGnESfEyauDDa4u%2bPDUH6D/CIpwPcFYRvLi%2b%2bq6f%2bRIhKHRTsGMV0y8lXpSZ5VqySWGSSaW9kofGage/IjW4HrvONeEtA4Szov3u7HgmqEUf0yzgivJ0
单击时会出现此错误:
Error HTTP 404.11 - Double escape sequence issue
答案 0 :(得分:1)
这里的根本问题是尝试在路径中添加确认代码。它应该通过querystring发送。 所以它应该是这样的
http://localhost:4322/Account/Confirm?code=UW/cj4xUj08kiGCntnWs7z1eUcWlyfNczH5IZfvf0ScTi4L1jgdkkus/Zb5ROJOWb%2b1XAVRSiBUvVGnESfEyauDDa4u%2bPDUH6D/CIpwPcFYRvLi%2b%2bq6f%2bRIhKHRTsGMV0y8lXpSZ5VqySWGSSaW9kofGage/IjW4HrvONeEtA4Szov3u7HgmqEUf0yzgivJ0
这将节省试图解决此问题的日子。
我在这个评论中找到了答案:http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx?PageIndex=1#comments感谢pranav rostgi
答案 1 :(得分:0)
您的令牌包含/
个符号,这些符号被解析为某个服务器页面的路径。您可以以某种方式对其进行编码(可能是base64)并使用查询字符串参数,如...?token=...
。或者更改令牌生成,使其仅包含好的符号
答案 2 :(得分:0)
您可能需要使用httputility.urlencode
对网址进行编码答案 3 :(得分:0)
确保您没有对令牌进行双重编码,因此您可以执行以下操作来发送电子邮件:
string code = await UserManager.GetConfirmationToken(user.Id);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");