【问题标题】:Create shorter tokens with small lifespan in ASP.NET Core Identity在 ASP.NET Core Identity 中创建寿命较短的令牌
【发布时间】:2019-12-21 14:52:07
【问题描述】:

使用 ASP.NET Core 3.1 我正在创建一个用户的电子邮件确认令牌以通过电子邮件发送:

String token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

我得到以下信息:

CfDJ8IjJLi0iO61KsS5NTyS4wJkSvCyzEDUBaVlXCkbxz6zwI1LocG8+WPubx5Rvoi4tFuiWAVFut4gfTnhgsdihE0gY+o7JyJrNtfXmzGLnczwbKZ3Wwy15+IUEi1h2qId72IRKvFqBSFv7rJdECSR/thZphpTQm7EnOuAA7loHlQFRWuMUVBce8HUsv1odbLNsKQ==

如何创建寿命较短的较短令牌而不是巨大的令牌?

【问题讨论】:

    标签: asp.net-core asp.net-core-3.0 asp.net-core-identity asp.net-core-3.1


    【解决方案1】:

    如果我了解问题所在,您正在考虑更换 TokenProvider,这可以在服务容器配置阶段完成

    TokenProvider.cs

    public class TokenProvider : IUserTwoFactorTokenProvider<IdentityUser>
        {
            public Task<string> GenerateAsync(string purpose, UserManager<IdentityUser> manager, IdentityUser user)
            {
                // generate your token here
            }
    
            public Task<bool> ValidateAsync(string purpose, string token, UserManager<IdentityUser> manager, IdentityUser user)
            {
                // validate your token here
            }
    
            public Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<IdentityUser> manager, IdentityUser user)
            {
                // check if user has email and it's been confirmed. or do your own logic
            }
        }
    

    在构建时注入您的容器

    services.AddIdentityCore<IdentityUser>(o =>
    {
        o.Tokens.EmailConfirmationTokenProvider = "MyTokenProvider";
    }).AddEntityFrameworkStores<IdentityDbContext>()
    .AddTokenProvider<TokenProvider>("MyTokenProvider");
    

    或在运行时:

    _userManager.RegisterTokenProvider(um.Options.Tokens.ChangeEmailTokenProvider, new TokenProvider());
    String token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
    

    默认情况下,您可以使用一些令牌提供程序(EmailPhoneNumberAuthenticator 是一些),您可以对其进行探索和构建。据我所知,EmailTokenProvider 将实际代码生成推迟到TotpSecurityStampBasedTokenProvider,您可以通过使用它实现的TOTP 算法来探索并查看您的生命周期要求是否可以改变

    【讨论】:

    • 哦,天哪.. 感谢您发布此信息。如果可以的话,我会为这篇文章点赞 1000 次。
    【解决方案2】:

    无论哪种方式,寿命都不会在这里考虑。但是,我认为您实际上在谈论的是 TOTP(定时一次性使用密码)——就像您通过 SMS 或身份验证器应用程序获得的密码一样。 ASP.NET Core 实际上内置了 TOTP 提供程序;默认情况下,它们只是不用于电子邮件确认、密码重置等。但是,这很容易改变:

    services.Configure<IdentityOptions>(o =>
    {
        o.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
    });
    

    奇怪的是,尽管被称为 DefaultEmailProvider,但默认情况下,该提供商实际上并未用于电子邮件确认之类的事情。它实际上是指成为通过电子邮件发送的 2FA 代码的默认 TOTP 提供商。不过,您也可以将其设置为电子邮件确认的提供者。

    【讨论】:

    • 我询问了 Lifespan,因为使用较短的代码不应该使用较短的寿命来避免暴力破解,例如用于电子邮件验证?
    猜你喜欢
    • 2018-08-16
    • 2020-09-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2021-06-16
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多