using Abp.Authorization; using Microsoft.AspNetCore.Identity; using VberZero.Authorization; using VberZero.Authorization.Roles; using VberZero.Authorization.Users; // ReSharper disable once CheckNamespace - This is done to add extension methods to Microsoft.Extensions.DependencyInjection namespace namespace Microsoft.Extensions.DependencyInjection; public static class VzIdentityBuilderExtensions { public static VzIdentityBuilder AddVzTenantManager(this VzIdentityBuilder builder) where T : VzTenantManager { var type = typeof(T); var managerType = typeof(VzTenantManager); builder.Services.AddScoped(type, provider => provider.GetRequiredService(managerType)); builder.Services.AddScoped(managerType, type); return builder; } public static VzIdentityBuilder AddVzRoleManager(this VzIdentityBuilder builder) where T : VzRoleManager { var type = typeof(T); var managerType = typeof(RoleManager<>).MakeGenericType(builder.RoleType); builder.Services.AddScoped(type, services => services.GetRequiredService(managerType)); builder.AddRoleManager(); return builder; } public static VzIdentityBuilder AddVzUserManager(this VzIdentityBuilder builder) where T : VzUserManager { var type = typeof(T); var managerType = typeof(UserManager<>).MakeGenericType(builder.UserType); builder.Services.AddScoped(type, services => services.GetRequiredService(managerType)); builder.AddUserManager(); return builder; } public static VzIdentityBuilder AddVzSignInManager(this VzIdentityBuilder builder) where T : VzSignInManager { var type = typeof(T); var managerType = typeof(SignInManager<>).MakeGenericType(builder.UserType); builder.Services.AddScoped(type, services => services.GetRequiredService(managerType)); builder.AddSignInManager(); return builder; } public static VzIdentityBuilder AddVzLogInManager(this VzIdentityBuilder builder) where TLogInManager : VzLogInManager { var type = typeof(TLogInManager); var managerType = typeof(VzLogInManager); builder.Services.AddScoped(type, provider => provider.GetService(managerType) ?? throw new InvalidOperationException()); builder.Services.AddScoped(managerType, type); return builder; } public static VzIdentityBuilder AddVzUserClaimsPrincipalFactory(this VzIdentityBuilder builder) where T : VzUserClaimsPrincipalFactory { var type = typeof(T); builder.Services.AddScoped(typeof(UserClaimsPrincipalFactory<,>).MakeGenericType(builder.UserType, builder.RoleType), services => services.GetRequiredService(type)); builder.Services.AddScoped(typeof(VzUserClaimsPrincipalFactory)); builder.Services.AddScoped(typeof(IUserClaimsPrincipalFactory<>).MakeGenericType(builder.UserType), services => services.GetRequiredService(type)); builder.Services.AddScoped(type); return builder; } public static VzIdentityBuilder AddVzSecurityStampValidator(this VzIdentityBuilder builder) where T : class, ISecurityStampValidator { var type = typeof(T); builder.Services.AddScoped(typeof(SecurityStampValidator<>).MakeGenericType(builder.UserType), services => services.GetRequiredService(type)); builder.Services.AddScoped(typeof(VzSecurityStampValidator)); builder.Services.AddScoped(typeof(ISecurityStampValidator), services => services.GetRequiredService(type)); builder.Services.AddScoped(type); return builder; } public static VzIdentityBuilder AddVzPermissionChecker(this VzIdentityBuilder builder) where T : class { var type = typeof(T); var checkerType = typeof(VzPermissionChecker); builder.Services.AddScoped(type); builder.Services.AddScoped(checkerType, provider => provider.GetService(type) ?? throw new InvalidOperationException()); builder.Services.AddScoped(typeof(IPermissionChecker), provider => provider.GetService(type) ?? throw new InvalidOperationException()); return builder; } public static VzIdentityBuilder AddVzUserStore(this VzIdentityBuilder builder) where T : class { var type = typeof(T); var vzStoreType = typeof(VzUserStore); var storeType = typeof(IUserStore<>).MakeGenericType(builder.UserType); builder.Services.AddScoped(type); builder.Services.AddScoped(vzStoreType, services => services.GetRequiredService(type)); builder.Services.AddScoped(storeType, services => services.GetRequiredService(type)); return builder; } public static VzIdentityBuilder AddVzRoleStore(this VzIdentityBuilder builder) where T : class { var type = typeof(T); var vzStoreType = typeof(VzRoleStore);//.MakeGenericType(builder.RoleType, builder.UserType); var storeType = typeof(IRoleStore<>).MakeGenericType(builder.RoleType); builder.Services.AddScoped(type); builder.Services.AddScoped(vzStoreType, services => services.GetRequiredService(type)); builder.Services.AddScoped(storeType, services => services.GetRequiredService(type)); return builder; } }