Asp.net身份电子邮件确认令牌问题:“无效令牌”

时间:2017-10-08 03:40:05

标签: c# asp.net asp.net-mvc asp.net-identity asp.net-identity-2

我正在使用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 个答案:

答案 0 :(得分:3)

如果要在ConfirmEmail

中进行解码,则需要进行第二次编码

string codeHtmlVersion = HttpUtility.UrlDecode(code);

分析令牌的变化方式:

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

答案 1 :(得分:0)

以下代码对我有用:

 HttpUtility.HtmlDecode(code);