2

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

String token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

我得到以下信息:

CfDJ8IjJLi0iO61KsS5NTyS4wJkSvCyzEDUBaVlXCkbxz6zwI1LocG8+WPubx5Rvoi4tFuiWAVFut4gfTnhgsdihE0gY+o7JyJrNtfXmzGLnczwbKZ3Wwy15+IUEi1h2qId72IRKvFqBSFv7rJdECSR/thZphpTQm7EnOuAA7loHlQFRWuMUVBce8HUsv1odbLNsKQ==

如何创建寿命较短的代币而不是巨大的代币?

4

2 回答 2

4

如果我理解这个问题,您正在考虑换掉一个 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);

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

于 2019-12-21T06:52:07.127 回答
1

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

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

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

于 2019-12-20T18:01:55.813 回答