Asp.net core 在ASP.NET Core Identity中创建寿命较短的令牌

Asp.net core 在ASP.NET Core Identity中创建寿命较短的令牌,asp.net-core,asp.net-core-3.0,asp.net-core-identity,asp.net-core-3.1,Asp.net Core,Asp.net Core 3.0,Asp.net Core Identity,Asp.net Core 3.1,我正在使用ASP.NET Core 3.1创建用户的电子邮件确认令牌,以便通过电子邮件发送: String token = await _userManager.GenerateEmailConfirmationTokenAsync(user); 我得到以下信息: CfDJ8IjJLi0iO61KsS5NTyS4wJkSvCyzEDUBaVlXCkbxz6zwI1LocG8+WPubx5Rvoi4tFuiWAVFut4gfTnhgsdihE0gY+o7JyJrNtfXmzGLnczwbKZ3W

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

String token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
我得到以下信息:

CfDJ8IjJLi0iO61KsS5NTyS4wJkSvCyzEDUBaVlXCkbxz6zwI1LocG8+WPubx5Rvoi4tFuiWAVFut4gfTnhgsdihE0gY+o7JyJrNtfXmzGLnczwbKZ3Wwy15+IUEi1h2qId72IRKvFqBSFv7rJdECSR/thZphpTQm7EnOuAA7loHlQFRWuMUVBce8HUsv1odbLNsKQ==

我如何才能创建寿命较短的代币,而不是使用寿命较长的代币?

在这里,无论哪种方式,寿命都不包括在内。然而,我认为你实际上所说的是TOTP定时一次性使用密码——就像你通过短信或验证器应用程序获得的密码一样。ASP.NET核心实际上内置了TOTP提供者;默认情况下,它们不用于电子邮件确认、密码重置等。然而,这很容易改变:

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

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

如果我理解这个问题,您正在考虑交换令牌提供程序,这可以在服务容器配置阶段完成

TokenProvider.cs
默认情况下,您可以使用一些令牌提供程序,您可以在此基础上进行探索和构建。据我所知,EmailTokenProvider延迟了实际的代码生成,您可以研究并查看是否可以通过使用它实现的算法来更改您的生命周期要求

我问了生命周期,因为使用更短的代码不应该使用更短的生命周期来避免暴力,例如,用于电子邮件验证?哦,天哪。。谢谢你发布这个。如果可以的话,我会把这篇文章翻1000遍。
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);