Multiple Identities in ASP.NET Core 2.0

后端 未结 3 584
眼角桃花
眼角桃花 2020-12-08 16:38

I am migrating an ASP.NET Core 1.0 application to ASP.NET Core 2.0.

In my startup I am configuring two identities:

services.AddIdentity

        
相关标签:
3条回答
  • 2020-12-08 17:29

    After looking through the ASP.NET Core source code on github, a second identity could be added using this extension method:

    using Microsoft.AspNetCore.Identity;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection.Extensions;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Whatever
    {
        public static class IdentityExtensions
        {
            public static IdentityBuilder AddSecondIdentity<TUser, TRole>(
                this IServiceCollection services)
                where TUser : class
                where TRole : class
            {
                services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
                services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
                services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
                services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
                services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
                services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
                services.TryAddScoped<UserManager<TUser>, AspNetUserManager<TUser>>();
                services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>();
                services.TryAddScoped<RoleManager<TRole>, AspNetRoleManager<TRole>>();
    
                return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 17:35

    Thank you very much for your answer keith. This saved me a lot of time! One small improvement: I had to configure some options (IdentityOptions) in my case. Like for example: Password Complexity Rules.

    I therefore included the registering of the Action setupAction. (This is the same way Microsoft does it within the AddIdentity inside IdentityServiceCollectionExtension)

    public static class IdentityExtensions
    {
        public static IdentityBuilder AddSecondIdentity<TUser, TRole>(
            this IServiceCollection services, Action<IdentityOptions> setupAction)
            where TUser : class
            where TRole : class
        {
            services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
            services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
            services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
            services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
            services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
            services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
            services.TryAddScoped<UserManager<TUser>, AspNetUserManager<TUser>>();
            services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>();
            services.TryAddScoped<RoleManager<TRole>, AspNetRoleManager<TRole>>();
    
            if (setupAction != null)
                services.Configure(setupAction);
    
            return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
        }
    }
    
    0 讨论(0)
  • 2020-12-08 17:36

    Asp.net Core 2.2 provides a built-in method for that purpose.

    AddIdentityCore<TUser>
    

    How to use it:

    services.AddIdentity<IdentityUser, IdentityRole>(configureIdentity)
       .AddDefaultTokenProviders()
       .AddUserStore<IdentityUserStore<IdentityUser>>()
       .AddRoleStore<IdentityRoleStore<IdentityRole>>();
    
    services.AddIdentityCore<Customer>(configureIdentity)
       .AddDefaultTokenProviders()
       .AddErrorDescriber<CustomerIdentityErrorDescriber>()
       .AddUserStore<CustomerStore<Customer>>()
       .AddRoleStore<CustomerRoleStore<CustomerRole>>();
    
    services.AddScoped<RoleManager<Customer>>();
    

    In fact, read the implementation of this method from asp.net core 2.2 github repo

        /// <summary>
        /// Adds and configures the identity system for the specified User type. Role services are not added by default 
        /// but can be added with <see cref="IdentityBuilder.AddRoles{TRole}"/>.
        /// </summary>
        /// <typeparam name="TUser">The type representing a User in the system.</typeparam>
        /// <param name="services">The services available in the application.</param>
        /// <param name="setupAction">An action to configure the <see cref="IdentityOptions"/>.</param>
        /// <returns>An <see cref="IdentityBuilder"/> for creating and configuring the identity system.</returns>
        public static IdentityBuilder AddIdentityCore<TUser>(this IServiceCollection services, Action<IdentityOptions> setupAction)
            where TUser : class
        {
            // Services identity depends on
            services.AddOptions().AddLogging();
    
            // Services used by identity
            services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
            services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
            services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
            services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
            services.TryAddScoped<IUserConfirmation<TUser>, DefaultUserConfirmation<TUser>>();
            // No interface for the error describer so we can add errors without rev'ing the interface
            services.TryAddScoped<IdentityErrorDescriber>();
            services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser>>();
            services.TryAddScoped<UserManager<TUser>>();
    
            if (setupAction != null)
            {
                services.Configure(setupAction);
            }
    
            return new IdentityBuilder(typeof(TUser), services);
        }
    
    0 讨论(0)
提交回复
热议问题