首页 > 解决方案 > 如何使用不同的 DbContext 配置多个 UserManager

问题描述

我正在努力使用 Net Core Identity,更具体地说是 UserManager API。我有两个具有相同逻辑结构的数据库,其中一个用于测试和认证目的。我环顾了一会儿,设法以某种方式使隔离访问在同一个应用程序下工作,创造了一个“认证环境”。由于我仍然需要执行与用户和角色相关的管理、身份验证和其他任务,因此我有兴趣保留默认 UserManager 的相同功能,但查看不同的数据库。现在我被困住了:GeneratePasswordResetTokenAsync()来自 UserManager 的方法失败,这取决于我如何设置StartUp.cs

启动.cs

services.Configure<IdentityOptions>(opt =>
        {
            opt.User.RequireUniqueEmail = true;
            opt.Password.RequiredLength = 8;
            opt.Lockout.AllowedForNewUsers = false;
            opt.SignIn.RequireConfirmedAccount = true;
            opt.SignIn.RequireConfirmedEmail = true;

            opt.Tokens.PasswordResetTokenProvider = "passwordReset";
            opt.Tokens.EmailConfirmationTokenProvider = "emailConfirmation";
        });

        services.AddIdentity<User, IdentityRole>()
            .AddEntityFrameworkStores<DNDriveContext>()
            .AddTokenProvider<TwoFactorTokenProvider<User>>("passwordReset")
            .AddTokenProvider<EmailConfirmationTokenProvider<User>>("emailConfirmation");


        services.AddIdentityCore<UserHom>()
            .AddRoles<IdentityRole>()
            .AddClaimsPrincipalFactory<UserClaimsPrincipalFactory<UserHom, IdentityRole>>()
            .AddEntityFrameworkStores<DNDriveHomContext>()
            .AddTokenProvider<TwoFactorTokenProvider<UserHom>>("passwordReset")
            .AddTokenProvider<EmailConfirmationTokenProvider<UserHom>>("emailConfirmation");

通过我对该主题的研究,我遇到了AddIdentityCore<TUser>()上面的方法,它可以很好地创建一个UserManager<TUser>我可以通过 DI 在控制器中访问的秒。这些角色也可以正常工作,我可以执行与“生产”环境隔离的令牌验证,但是当我尝试调用GeneratePasswordResetTokenAsync()时,我收到以下错误:

没有注册名为“passwordReset”的 IUserTwoFactorTokenProvider。

我尝试将IdentityOptions单独传递给每个 Identity 而不是调用services.Configure<IdentityOptions>,但这并没有什么不同。我认为这是一个分配问题,因为一次只有一个 UserManagers 工作。通过上面的配置,UserManager<UserHom>会成功生成reset password token,但是mainUserManager<User>会抛出上述错误。AddTokenProvider<>在最后评论这两个AddIdentityCore<UserHom>修复了主要的 UserManager,但现在认证失败了。

我知道制作自定义 UserManager 的可能性,但正如我一开始所说,我想保留 UserManager 的所有默认功能,我不知道如何开始实现自己的一个。对于正在发生的事情的确切解释是什么,我该如何解决这个问题?

标签: .net-coreasp.net-identityusermanager

解决方案


推荐阅读