如果我理解这个问题,您正在考虑换掉一个 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);
默认情况下,您可以使用一些令牌提供程序(Email
,PhoneNumber
并且Authenticator
是一些),您可以对其进行探索和构建。据我所知,EmailTokenProvider
推迟实际代码生成TotpSecurityStampBasedTokenProvider
,您可以探索并查看您的生命周期要求是否可以通过使用它实现的TOTP算法来改变