2017-10-08 115 views
0

我使用asp.net的身份,并在我的帐户,下面的部分代码/注册方法:问题与Asp.net身份确认电子邮件令牌:“无效令牌”

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

string codeHtmlVersion = HttpUtility.UrlEncode(code); 

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

我然后发送给callbackUrl用户在电子邮件中。当我调试的代码,我看到了以下值:

代码: “GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh + 02TK4R + lhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe + 9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd/SJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF”

codeHtmlVersion: “GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%2fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF”

然后在我的ConfirmEmail方法中,我将数值反转(或者我打算这么做):

public async Task<ActionResult> ConfirmEmail(string userId, string code) 
{ 
    string codeHtmlVersion = HttpUtility.UrlEncode(code); 

    var result = await UserManager.ConfirmEmailAsync(userId, codeHtmlVersion); 
    .... 
} 

当用户点击从他的电子邮件中的确认链接,在我的调试会话时,我看到了以下值:

代码: “GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%2fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF”

codeHtmlVersion: “GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%252b02TK4R%252blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%252b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%252fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF”

因此,可以看到我的代码以某种方式改变,因此用户收到“无效令牌”错误消息。有人能帮我弄清楚我在这里做错了什么吗?非常感激。

回答

2

您编码第二遍的时候,你想在ConfirmEmail

string codeHtmlVersion = HttpUtility.UrlDecode(code);

进行解码分析如何使你的令牌得到改变:

  1. +编码后首次成为%2b
  2. %2b在第二次编码后变成%252b(它编码 %符号为%25)
+0

非常感谢。愚蠢的错误,但你救了我很多头痛! –