繁体   English   中英

为什么在ASP.NET Identity中我会收到零星的无效令牌来进行电子邮件验证?

[英]Why am I getting sporadic invalid tokens for email verification in ASP.NET Identity?

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

设置如下:

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

这是令牌的生成方式:

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

验证方式如下:

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

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

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

编辑:

我仔细研究了源代码(文档非常糟糕),正如下面的EmailTokenProvider所指出的那样, EmailTokenProvider在此用例中是错误的。 它基于TotpSecurityStampBasedTokenProvider ,该令牌对令牌的硬编码超时为3分钟!

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

最好的办法是使用Identity提供的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 
    }
}

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

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

这样,您将获得非常长的电子邮件令牌,可以持续24小时。

我犯了与您相同的错误,但是当用户抱怨时必须尽快纠正。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM