2

I'm struggling with Net Core Identity, more specifically the UserManager API. I have two databases with the same logic structure, one of them is for testing and homologation purposes. I looked around for a good while and managed to somehow make the segregated access work under the same application, creating a "homologation ambient". Since I still have to perform user and role-related management, authentication, and other tasks, it is in my interest to keep the same functions of the default UserManager, but looking at a different database. And now I'm stuck with this: the GeneratePasswordResetTokenAsync() method from UserManager fails, depending on how I set the StartUp.cs:

StartUp.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");

Through my research on the topic, I came across the AddIdentityCore<TUser>() method above, and it works fine in creating a second UserManager<TUser> that I can access in the controller via DI. The roles work fine too, and I can perform token validations segregated from the "production" environment, but the moment I try to call GeneratePasswordResetTokenAsync(), I get the following error:

No IUserTwoFactorTokenProvider named 'passwordReset' is registered.

I tried passing the IdentityOptions to each Identity individually instead of calling services.Configure<IdentityOptions>, but it didn't make a difference. I assume this is an issue of assignment since only one of the UserManagers works at a time. With the above configuration, UserManager<UserHom> will successfully generate the reset password token, but the main UserManager<User> will throw the above-mentioned error. Commenting the two AddTokenProvider<> at the end of AddIdentityCore<UserHom> fixes the main UserManager, but now the homologation one fails.

I'm aware of the possibility of making a custom UserManager, but as I said in the beginning, I would like to keep all the default functions of UserManager, and I have no idea of how to start implementing one of my own. What exactly is the explanation for what is happening and how do I fix this?

0 Answers0