为什么我在ASP.NET身份中获得用于电子邮件验证的零星无效令牌?

Kug*_*gel 5 .net c# asp.net-identity-2

我想弄清楚为什么我的用户在确认他们的电子邮件时会经常收到无效令牌.我无法重现这个问题.

这是设置:

userManager.UserTokenProvider = new EmailTokenProvider<User>();
Run Code Online (Sandbox Code Playgroud)

以下是令牌的生成方式:

var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id);
Run Code Online (Sandbox Code Playgroud)

以下是它的验证方式:

var result = await userManager.ConfirmEmailAsync(user.Id, code);
Run Code Online (Sandbox Code Playgroud)

据我所知,EmailTokenProvider使用安全标记进行无效.我的理解是,只有在更改用户实体(如更改密码或用户名)时,此戳记才会更改.然而,我更频繁地获得无效令牌,这是唯一的解释.

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

编辑:

我挖掘了源代码(文档非常差),并且@trailmax指出下面EmailTokenProvider这个用例是错误的.它基于TotpSecurityStampBasedTokenProvider令牌的硬编码超时为3分钟!

tra*_*max 8

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

然后在UserManager的构造函数中重新分配它:

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

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

我犯了同样的错误,但是在用户抱怨时不得不纠正.