Я создаю динамическую c мультитенантную архитектуру, в которой у меня будет TenantId в строке запроса при выполнении операций идентификации, таких как вход в систему, забытый пароль и сброс пароля. И у меня будет TenantId в заявках пользователей, если пользователь вошел в систему.
Я создаю свой пользовательский менеджер, подобный этому,
public static UserManager<ApplicationUser> CreateUserManager(AppIdentityDbContext identityDbContext, ILoggerFactory loggerFactory, IOptions<IdentityOptions> options, string tenentId) {
IPasswordHasher<ApplicationUser> hasher = new PasswordHasher<ApplicationUser>();
var validator = new UserValidator<ApplicationUser>();
var validators = new List<UserValidator<ApplicationUser>> { validator };
ILogger<UserManager<ApplicationUser>> logger =
loggerFactory.CreateLogger<UserManager<ApplicationUser>>();
var applicationUserManager = new UserManager<ApplicationUser>(
new ApplicationUserStore(identityDbContext, new ApplicationTenantIdProvider(tenentId)),
options,
hasher,
validators,
null,
null,
null,
null,
logger
);
return applicationUserManager;
}
У меня ведется регистрация, как и ожидалось - где Я бы создал usermanager, вызывающий вышеуказанный метод stati c.
Однако при сбросе пароля при вызове ResetPasswordAsyn c (user, passwordResetToken, password) с созданным пользователем пользовательским UserManager я получаю это исключение.
No IUserTwoFactorTokenProvider named 'Default' is registered
Я передаю параметры ввода-вывода, используя DI, откуда я вызываю метод CreateUserManager.
Вот код Startup.cs, относящийся к Идентичности.
services.AddScoped<IRoleStore<ApplicationRole>, ApplicationRoleStore>();
services.AddScoped<IUserStore<ApplicationUser>, ApplicationUserStore>();
services.AddScoped<TenantIdProviderService>();
services.AddScoped(serviceProvider => new ApplicationTenantIdProvider(null));
services.AddIdentity<ApplicationUser, ApplicationRole>(o => {
o.User.RequireUniqueEmail = false;
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonAlphanumeric = false;
o.Password.RequiredLength = 6;
})
.AddUserStore<ApplicationUserStore>()
.AddDefaultTokenProviders();
services.AddAuthentication();
Вот выходные данные отладчика для моего пользовательского объекта usermanager - Часть токенов ![Here is the debugger output for my custom usermanager object - Tokens part](https://i.stack.imgur.com/slxnJ.png)
Существует ли простой или правильный способ установки параметров IdentityOptions по умолчанию (я думаю, что именно здесь у меня проблема).
Любая помощь приветствуется.