Asp.net 身份电子邮件确认令牌问题:"Invalid Token"
Issue with Asp.net identity Email Confirmation Token: "Invalid Token"
我正在使用 asp.net 身份并且在我的 Account/Register 方法中有以下部分代码:
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);
....
}
当用户从他的电子邮件中单击确认 link 时,在我的调试会话中,我看到以下值:
代码:
"GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%2fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"
代码HTML版本:
"GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%252b02TK4R%252blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%252b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%252fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"
因此可以看出我的代码正在以某种方式更改,因此用户收到 "Invalid Token" 错误消息。有人可以帮我弄清楚我在这里做错了什么吗?非常感激。
当您想在 ConfirmEmail
中解码时,您正在第二次编码
string codeHtmlVersion = HttpUtility.UrlDecode(code);
正在分析您的令牌如何更改:
+
第一次编码后变成%2b
%2b
第二次编码后变成%252b
(编码
% 符号到 %25)
下面的代码对我有用:
HttpUtility.HtmlDecode(code);
我正在使用 asp.net 身份并且在我的 Account/Register 方法中有以下部分代码:
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);
....
}
当用户从他的电子邮件中单击确认 link 时,在我的调试会话中,我看到以下值:
代码: "GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%2fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"
代码HTML版本: "GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%252b02TK4R%252blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%252b9tfUhcReAn50YqZp0aYbHy2QyHLc7EAUSyd%252fSJpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"
因此可以看出我的代码正在以某种方式更改,因此用户收到 "Invalid Token" 错误消息。有人可以帮我弄清楚我在这里做错了什么吗?非常感激。
当您想在 ConfirmEmail
string codeHtmlVersion = HttpUtility.UrlDecode(code);
正在分析您的令牌如何更改:
+
第一次编码后变成%2b
%2b
第二次编码后变成%252b
(编码 % 符号到 %25)
下面的代码对我有用:
HttpUtility.HtmlDecode(code);