gpt4 book ai didi

c# - Asp.net Core 电子邮件确认有时会显示 InvalidToken

转载 作者:可可西里 更新时间:2023-11-01 07:48:13 27 4
gpt4 key购买 nike

我使用的是 asp.net core identity 2.1,我遇到了一个随机的电子邮件确认问题,虽然电子邮件确认有时会显示 result.Error = InvalidToken。 token 也没有过期。

注意:我们正在使用多台服务器,我们还将 key 存储在一个地方,以便所有服务器都使用相同的 key 。

用于电子邮件确认的代码段。

电子邮件确认

var confCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new
{
userId = user.Id,
code = WebUtility.UrlEncode(confCode)
}, protocol: HttpContext.Request.Scheme);

string confirmationEmailBody = string.Format(GetTranslatedResourceString("ConfirmationEmailBody"), "<a href='" + callbackUrl + "'>") + "</a>";

token 验证

public async Task<bool> ConfirmEmailAsync(string userId, string code)
{
if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(code))
return false;


var user = await _userManager.FindByIdAsync(userId);

if (user == null)
return false;

var result = await _userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false);

if (!result.Succeeded)
result = await _userManager.ConfirmEmailAsync(user, WebUtility.UrlDecode(code)).ConfigureAwait(false);

return result.Succeeded;
}

无效 token

下面的 token 被编码了两次,但我们会处理这种情况

CfDJ8HYrrpCgcr5GvrItPOWapXRy8WF8odd%252BVKuDup7buRsl1x4agRpfgQlEIPWiBqM0Wuilu9tCv5l%252B3lNaAb89%252Fi%252B4k0y%252FH0jdXAbabz0%252FXDGA0eUrmcKdIsDFNuXeyP5ezTVmTx8t0ky9xCTXaKLAfvTsCJviETk5Ag9JbUs3l3%252BnUon6fyYOHsslJI5VKLqhMM0Sm%252BW1EE%252B%252FPEJ%252BXcn%252FPS1My%252BI1lExuF1R1hFEZScEsUCG%252Bx%252BVIFB9bzs1IoLC%252Baw%253D%253D

任何帮助将不胜感激,谢谢!

最佳答案

这个问题似乎是基本的查询字符串相关问题。您的问题中没有关于样本预期值和样本实际值的指示。因此,我无法在这里为您提供准确的答案。但以下两点是一定会解决这个问题的指针。

可能有两个问题:

问题 1:HtmlDecode/UrlDecode 后未恢复原始 Base-64

这些标记被编码为 base 64 字符串,其中可能包含“+”等字符。

它们被发送到服务器。

然后服务器尝试对该字符串执行 HtmlDecode 操作,以删除原始 base 64 token 中实际存在的字符。

例如'+' 被空字符串替换。

所以,WebUtility.HtmlDecode 之后生成的token 是无效的。这就是您收到无效 token 错误的原因

How to check this ? 您可以调试并查看 HtmlDecode 之后的值是多少以及期望值是多少。如果它们不同,那么这就是根本原因。

问题 2:查询字符串格式不正确

查询字符串中的多个键值对使用“&”字符连接。例如键1=值1&键2=值2

但有时不是 & ,它的编码版本 & 出现在查询字符串中。
例如键1=值1&键2=值2

如果是这种情况,.Net 服务器将无法正确解析查询字符串。

如何检查? 您可以使用 QueryString 属性直接从 HttpContext 或 HttpRequest 读取原始查询字符串,并检查是否属于这种情况。如果是,那么您可以更改客户端以发送适当的查询字符串(更具逻辑性和可维护性)或编写一些代码以在服务器端更正它。

这些指示应该可以帮助您解决问题。

关于c# - Asp.net Core 电子邮件确认有时会显示 InvalidToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54501112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com