【问题标题】:ConfirmEmailAsync() getting Invalid Token no matter whatConfirmEmailAsync() 无论如何都会得到无效的令牌
【发布时间】:2021-08-30 21:12:56
【问题描述】:

我正在尝试验证用户的电子邮件确认令牌,但无论我做什么,总是收到 INVALID TOKEN 错误。

我的代码很简单

生成令牌

EmailVerificationCode = await userManager.GenerateEmailConfirmationTokenAsync(user);
EmailVerificationHTMLFormatCode = HttpUtility.UrlEncode(EmailVerificationCode);

验证令牌

 var result = await userManager.ConfirmEmailAsync(user, code);

我总是收到 INVALID TOKEN 错误。

我尝试过的事情

  1. 通过将生成的令牌和接收的令牌放入数据库进行验证,它们完全相同。
  2. 尝试使用HttpUtility.UrlDecode(Code)在接收端解码令牌
  3. 试图只使用没有HttpUtility.UrlEncode的RAW令牌来验证它

我也经历了以下解决方案

  1. Asp.net 2.0 Identity, ConfirmEmailAsync() getting Invalid Token
  2. Invalid Token. while verifying email verification code using UserManager.ConfirmEmailAsync(user.Id, code)
  3. AspNet.Identit 2.1.0 ConfirmEmailAsync always returns Invalid token
  4. Asp.NET Identity 2 giving "Invalid Token" error

无论我做什么,它总是一个无效的令牌,我可以清楚地看到令牌是 100% 正确的。

知道我做错了什么吗?

编辑 - 如果这有帮助,我的 Startup.cs 具有以下身份配置

// For Identity
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
   {
     // configure identity options
     o.Password.RequireDigit = false;
     o.Password.RequireLowercase = false;
     o.Password.RequireUppercase = false;
     o.Password.RequireNonAlphanumeric = false;
       o.Password.RequiredLength = 6;
    })
      .AddEntityFrameworkStores<ApplicationDbContext>()
      .AddDefaultTokenProviders();

【问题讨论】:

  • 您是否在多服务器环境中运行?您是否实施了数据保护存储库?
  • 等等。我刚刚注意到您的标签中有 2/3 是 ASP.NET,并且您链接的所有问题都是 ASP.NET。是不是 ASP.NET Core 标签错误?
  • @Llama 道歉,标签已更正,它是 asp.net core - 不,我正在运行单个服务器环境,实际上只是 azure 上的一个应用程序。但无论我在哪里运行,Localhost 或 Azure,结果都是一样的。 data protection repository 对我来说是全新的,我需要实现它吗?我在 Postman 中尝试过,它总是无法验证令牌。此外,如果这有帮助,手机号码验证(使用 PIN 码)就可以正常工作,只是电子邮件代码不起作用。
  • 令牌基本上是加密的。如果应用程序在此期间重新启动,并且设置不正确,那么它可能会生成新的加密密钥,而您无法再次解密它们。看起来你可以使用KeyVault
  • 嗨@Llama,我看了看,这是我们将在未来实施的东西,现在我们希望将其保持为默认值。在我尝试验证电子邮件地址时,该应用程序尚未重新启动或重新部署(或进入睡眠状态等)。还有什么可能导致加密密钥重置?

标签: c# asp.net-core asp.net-core-webapi asp.net-core-identity


【解决方案1】:

在我回答之前,有几个关于这个实现的问题。

  1. 您是否实现了自定义 DataProtectionProvider?
  2. 您是否覆盖默认令牌生命周期为 x 小时数?

您可以做些什么来解决这个问题,创建一个如下所示的客户 DataProtectionProvider,

public class EmailConfirmationTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
{
    public EmailConfirmationTokenProvider(IDataProtectionProvider dataProtectionProvider, 
        IOptions<EmailConfirmationTokenProviderOptions> options, 
        ILogger<DataProtectorTokenProvider<TUser>> logger) 
        : base(dataProtectionProvider, options, logger)
    {
    }
}
public class EmailConfirmationTokenProviderOptions : DataProtectionTokenProviderOptions
{
}

然后注入生命周期为2小时的配置服务。

 services.AddTokenProvider<EmailConfirmationTokenProvider<User>>("emailconfirmation");

services.Configure(opt => opt.TokenLifespan = TimeSpan.FromHours(3));

谢谢

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2015-04-29
    • 2021-08-14
    • 1970-01-01
    • 2023-04-03
    • 2021-06-18
    • 2012-08-09
    • 2017-07-21
    • 2012-04-09
    相关资源
    最近更新 更多