Do tnet Core Identity - Multi Tenant - Пользовательский UserManager - NotSupportedException: IUserTwoFactorTokenProvider с именем «Default» не зарегистрирован - PullRequest
0 голосов
/ 23 января 2020

Я создаю динамическую 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

Существует ли простой или правильный способ установки параметров IdentityOptions по умолчанию (я думаю, что именно здесь у меня проблема).

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Это, конечно, выглядит странно. Метод пользовательского менеджера пользователей FindByNameAsyn c (у меня есть этот метод в моем пользовательском хранилище пользователей) - работает как положено. Однако любые методы, такие как ResetPasswordAsyn c, не подходят для моего пользовательского менеджера пользователей, но работают с моим объектом UserManager, добавленным в DI !! Что хорошо для меня. Итак, похоже, у меня есть мультитенантная система с рабочим удостоверением.

0 голосов
/ 23 января 2020

Вы добавили поставщиков по умолчанию, но не указали их использование, например;

    services.AddIdentity<User, Role>(options =>{
        options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultProvider;
        ...
    })
    .AddDefaultTokenProviders();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...