using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace zero.Identity; public static class ZeroIdentityExtensions { public static IdentityBuilder AddZeroIdentity(this IServiceCollection services) where TUser : ZeroIdentityUser, new() where TRole : ZeroIdentityRole, new() { services.AddZeroIdentityCore(); IdentityBuilder builder = new(typeof(TUser), typeof(TRole), services); builder.AddDefaultTokenProviders(); builder.AddUserStore>(); builder.AddSignInManager>(); builder.AddClaimsPrincipalFactory>(); builder.AddRoleValidator>(); builder.AddRoleManager>(); builder.AddRoleStore>(); return builder; } public static IdentityBuilder AddZeroIdentity(this IServiceCollection services) where TUser : ZeroIdentityUser, new() { services.AddZeroIdentityCore(); IdentityBuilder builder = new(typeof(TUser), services); builder.AddDefaultTokenProviders(); builder.AddUserStore>(); builder.AddSignInManager>(); builder.AddClaimsPrincipalFactory>(); return builder; } static IServiceCollection AddZeroIdentityCore(this IServiceCollection services) where TUser : ZeroIdentityUser, new() { services.AddHttpContextAccessor(); services.AddOptions(); services.AddLogging(); services.TryAddScoped, UserValidator>(); services.TryAddScoped, PasswordValidator>(); services.TryAddScoped, PasswordHasher>(); services.TryAddScoped(); services.TryAddScoped, DefaultUserConfirmation>(); services.TryAddScoped(); services.TryAddScoped>(); services.Configure(opts => { opts.ClaimsIdentity.UserIdClaimType = Constants.Auth.Claims.UserId; opts.ClaimsIdentity.UserNameClaimType = Constants.Auth.Claims.UserName; opts.ClaimsIdentity.RoleClaimType = Constants.Auth.Claims.Role; opts.ClaimsIdentity.SecurityStampClaimType = Constants.Auth.Claims.SecurityStamp; opts.ClaimsIdentity.EmailClaimType = Constants.Auth.Claims.Email; opts.Password.RequireDigit = false; opts.Password.RequireLowercase = false; opts.Password.RequireUppercase = false; opts.Password.RequireNonAlphanumeric = false; opts.Password.RequiredLength = 8; opts.Password.RequiredUniqueChars = 1; opts.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(60); opts.Lockout.MaxFailedAccessAttempts = 5; opts.Lockout.AllowedForNewUsers = true; opts.User.RequireUniqueEmail = true; }); services.Configure(opts => { opts.ValidationInterval = TimeSpan.FromMinutes(90); }); return services; } }