Skip to main content
 首页 » 编程设计

c#之Asp.net 身份问题电子邮件确认 token : "Invalid Token"

2024年02月27日39pengyingh

我正在使用 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+9tfUhcReAn50YqZp0aYbHy2QydOpHLc7JEAUS BPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"

codeHtmlVersion: "GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50yqHLfQYZp0aySp0a JpCHdlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"

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

public async Task<ActionResult> ConfirmEmail(string userId, string code) 
{ 
  string codeHtmlVersion = HttpUtility.UrlEncode(code); 
 
  var result = await UserManager.ConfirmEmailAsync(userId, codeHtmlVersion); 
  .... 
} 

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

代码: "GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%2b02TK4R%2blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%2b9tfUhcReAn50YqZp0aYbHy2QydHLdOc7EAUS qpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"

代码HTML版本: "GE2HDQSSjAboLqEBdBv5rTjyksC09o110uqa4Dh%252b02TK4R%252blhwgfjEaFiZkOc9GfQBKKryTTIgeITlgDgtvnDtVvk6SJyAjw7iuSPdNe%252b9tfUhcReAn50YqZfyQyEAJ2YbCH7Hy2 dlgRsaAdOqpBPlI4zcd3FlbuMxiRdjHJq3q2K12YdQWcCF"

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

请您参考如下方法:

当你想在ConfirmEmail中解码时,你正在第二次编码

string codeHtmlVersion = HttpUtility.UrlDecode(code);

分析您的 token 如何更改:

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