Asp.net核心电子邮件确认有时会说InvalidToken

M.T*_*zil 15 c# asp.net asp.net-mvc .net-core asp.net-core-2.1

我正在使用asp.net核心身份2.1,我有一个随机的电子邮件确认问题,虽然电子邮件确认有时会说result.Error = InvalidToken.令牌也未过期.

注意:我们使用多个服务器,并且我们还将密钥存储在一个位置,以便所有服务器使用相同的密钥.

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

邮件确认

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>";
Run Code Online (Sandbox Code Playgroud)

验证令牌

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;
    }
Run Code Online (Sandbox Code Playgroud)

令牌无效

以下令牌编码两次,但我们处理这种情况

CfDJ8HYrrpCgcr5GvrItPOWapXRy8WF8odd%252BVKuDup7buRsl1x4agRpfgQlEIPWiBqM0Wuilu9tCv5l%252B3lNaAb89%252Fi%252B4k0y%252FH0jdXAbabz0%252FXDGA0eUrmcKdIsDFNuXeyP5ezTVmTx8t0ky9xCTXaKLAfvTsCJviETk5Ag9JbUs3l3%252BnUon6fyYOHsslJI5VKLqhMM0Sm%252BW1EE%252B%252FPEJ%252BXcn%252FPS1My%252BI1lExuF1R1hFEZScEsUCG%252Bx%252BVIFB9bzs1IoLC%252Baw%253D%253D
Run Code Online (Sandbox Code Playgroud)

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

小智 0

您的电子邮件确认请求将为您提供 userId 和您的私钥的响应,但您的令牌方法应该是不同的功能,例如令牌刷新,您需要添加一些条件,例如令牌是否已过期,然后刷新令牌