为什么我在“身份”中收到用于电子邮件验证的零星无效令牌 ASP.NET

本文关键字:验证 无效 NET ASP 令牌 电子邮件 用于 身份 为什么 | 更新日期: 2023-09-27 18:33:40

我试图弄清楚为什么我的用户在确认他们的电子邮件时经常收到无效令牌。我无法重现该问题。

这是设置:

userManager.UserTokenProvider = new EmailTokenProvider<User>();

以下是令牌的生成方式:

var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id);
以下是

验证方法:

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

我了解EmailTokenProvider使用安全标记进行失效。我的理解是,只有在对用户实体进行重大更改(例如更改密码或用户名)时,此图章才会更改。但是,我更频繁地收到无效令牌,因为这是唯一的解释。

正在寻找任何可以帮助我阐明为什么会发生这种情况的指针。

编辑:

我深入研究了源代码(文档非常差),正如下面@trailmax指出的那样EmailTokenProvider这个用例是错误的。它基于 TotpSecurityStampBasedTokenProvider 将令牌硬编码超时为 3 分钟!

为什么我在“身份”中收到用于电子邮件验证的零星无效令牌 ASP.NET

EmailTokenProvider生成非常短的令牌,看起来像 6 位数字。该令牌旨在成为2FA,并且仅在短时间内有效(例如10-15分钟,不知道实际值)。

你能做的最好的事情就是使用身份提供的DataProtectorTokenProvider,这有点棘手,因为从OWIN手中夺走它并不简单。

我绕过它的方法是在我的Start.Auth.cs中分配静态变量,然后在UserManager中重用它:

public class AuthConfig
{
    public static IDataProtectionProvider DataProtectionProvider { get; set; }
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
    public void ConfigureAuth(IAppBuilder app)
    {
        DataProtectionProvider = app.GetDataProtectionProvider();
        // do other configuration 
    }
}

然后在用户管理器的构造函数中重新分配它:

        var dataProtectorProvider = AuthConfig.DataProtectionProvider;
        var dataProtector = dataProtectorProvider.Create("My Asp.Net Identity");
        this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, Guid>(dataProtector)
        {
            TokenLifespan = TimeSpan.FromHours(24),
        };

通过这种方式,您可以获得持续 24 小时的非常长的电子邮件令牌。

和你犯了同样的错误,但是一旦用户抱怨,我不得不尽快纠正。