我有(2) Identity systems
,每个Context
都有
1: CustomerContext : IdentityDbContext<CustomerUser>
2: ApplicationContext : IdentityDbContext<ApplicationUser>
我已经成功地在ASP.NET核心3.0API启动文件中注册了它们。一个使用'AddIdentity',另一个使用AddIdentity
我还将'AddDefaultTokenProviders'添加到了它们中。虽然它构建并运行,但当我尝试使用令牌提供程序(如GenerateEmailConfirmationTokenAsync或GeneratePasswordResetTokenAsync. )时,会出现问题。
如果我从注册中删除其中的一个“AddDefaultTokenProviders”,那么使用令牌对带有'AddDefaultTokenProviders‘的标识进行工作,如果两者都包括AddDefaultTokenProviders,则两者都不工作。我得到了这些例外(为了简洁起见,我对它们做了一些修改):
System.NotSupportedException: No IUserTwoFactorTokenProvider named 'Default' is registered.
- at Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync(GenerateEmailConfirmationTokenAsync)
OR
- at Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync(GeneratePasswordResetTokenAsync)
以下是Startup.cs中的身份注册:
CustomerUser
services.AddIdentity<CustomerUser, CustomerRole>(options =>
{
options.Password.RequiredLength = 6;
})
.AddEntityFrameworkStores<CustomerContext>()
.AddDefaultTokenProviders(); // <-- CANNOT HAVE (2)
ApplicationUser
var builder = services.AddIdentityCore<ApplicationUser>(options =>
{
options.Password.RequiredLength = 6;
});
builder = new IdentityBuilder(builder.UserType, typeof(ApplicationRole), builder.Services);
builder.AddEntityFrameworkStores<ApplicationContext>();
builder.AddDefaultTokenProviders(); // <-- CANNOT HAVE (2)
我偶然看到一篇文章提到IdentityOptions是单例的,不能两次调用AddDefaultTokenProviders。但没办法解决这个问题。
如何包括两个标识的默认令牌提供程序?是否需要创建自定义令牌提供程序?如果是这样的话,是怎么做的?我不需要任何令牌定制,我只需要默认的令牌行为。
谢谢。
发布于 2020-12-28 10:34:16
您应该添加令牌提供程序。
public class PasswordResetTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
{
public PasswordResetTokenProvider(IDataProtectionProvider dataProtectionProvider,
IOptions<PasswordResetTokenProviderOptions> options,
ILogger<DataProtectorTokenProvider<TUser>> logger)
: base(dataProtectionProvider, options, logger)
{
}
}
public class PasswordResetTokenProviderOptions : DataProtectionTokenProviderOptions
{
public PasswordResetTokenProviderOptions()
{
Name = "PasswordResetTokenProvider";
TokenLifespan = TimeSpan.FromDays(3);
}
}
Startup.cs
services.AddIdentity<AppTenantUser, AppTenantRole>(config =>
{
config.SignIn.RequireConfirmedEmail = true;
config.Tokens.EmailConfirmationTokenProvider = "emailConfirmation";
config.Tokens.PasswordResetTokenProvider = "passwordReset";
config.Password.RequiredLength = 0;
config.Password.RequiredUniqueChars = 0;
config.Password.RequireLowercase = false;
config.Password.RequireUppercase = false;
config.Password.RequireDigit = false;
config.Password.RequireNonAlphanumeric = false;
config.User.RequireUniqueEmail = true;
config.User.AllowedUserNameCharacters = "abcçdefghiıjklmnoöpqrsştuüvwxyzABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._@+'#!/^%{}*";
})
.AddEntityFrameworkStores<TenantDbContext>()
.AddDefaultTokenProviders()
.AddTokenProvider<EmailConfirmationTokenProvider<AppTenantUser>>("emailConfirmation")
.AddTokenProvider<PasswordResetTokenProvider<AppTenantUser>>("passwordReset");
https://stackoverflow.com/questions/59303760
复制相似问题