public static IServiceCollection AddLoginAuthenticator <TAuthenticator>(this IServiceCollection services, Action <LoginAuthenticationBuilder> init)
            where TAuthenticator : LoginAuthenticator
        {
            var builder = new LoginAuthenticationBuilder(services);

            init(builder);
            return(services
                   .AddSingleton(new LoginCollection(builder._loginTypes.ToImmutableDictionary()))
                   .AddScoped <LoginAuthenticator, TAuthenticator>());
        }
        public static LoginAuthenticationBuilder AddGoogleLogin(this LoginAuthenticationBuilder builder, Action <OAuth2ConfigurationBuilder> configure)
        {
            var configurationBuilder = new OAuth2ConfigurationBuilder();

            configure(configurationBuilder);
            builder
            .AddLogin <GoogleLogin>()
            .Services
            .AddSingleton(configurationBuilder.Build <GoogleLogin>());
            return(builder);
        }
        public static LoginAuthenticationBuilder AddLinkedLogin <TUserManager, TLinkedUserManager, TId>(
            this LoginAuthenticationBuilder builder,
            Action <LoginAuthenticationBuilder> externalLoginConfigure)
            where TUserManager : class, IUserManager <TId>
            where TLinkedUserManager : class, ILinkedUserManager
        {
            var externalLoginBuilder = new LoginAuthenticationBuilder(builder.Services);

            externalLoginConfigure(externalLoginBuilder);
            foreach (var kv in externalLoginBuilder)
            {
                var desc = new LoginDescriptor(kv.Key, kv.Value.Type, kv.Value.args);
                builder.AddLogin <LinkedLogin <TId> >(desc.Name, desc);
            }
            builder.Services.TryAddTransient <IUserManager <TId>, TUserManager>();
            builder.Services.TryAddTransient <ILinkedUserManager, TLinkedUserManager>();
            return(builder);
        }
 public static LoginAuthenticationBuilder AddLinkedLogin <TUserManager>(
     this LoginAuthenticationBuilder builder,
     Action <LoginAuthenticationBuilder> externalLoginConfigure)
     where TUserManager : class, IUserManager <int>, ILinkedUserManager
 => builder.AddLinkedLogin <TUserManager, TUserManager>(externalLoginConfigure);
        public static LoginAuthenticationBuilder AddPasswordAuthentication <TUserManager, TUserId, TPasswordLogin>(this LoginAuthenticationBuilder builder, Action <PasswordLoginOptionsBuilder> configure = null)
            where TUserManager : class, IUserManager <TUserId>
            where TPasswordLogin : PasswordLogin <TUserId>
        {
            var optionsBuilder = new PasswordLoginOptionsBuilder();

            configure?.Invoke(optionsBuilder);
            builder
            .AddLogin <TPasswordLogin>()
            .Services
            .AddSingleton(optionsBuilder.Build())
            .TryAddTransient <IUserManager <TUserId>, TUserManager>();
            return(builder);
        }
 public static LoginAuthenticationBuilder AddPasswordAuthentication <TUserManager, TUserId>(this LoginAuthenticationBuilder builder, IConfiguration configuration)
     where TUserManager : class, IUserManager <TUserId>
 => builder.AddPasswordAuthentication <TUserManager, TUserId>(optionsBuilder => configuration.Bind(optionsBuilder));
 public static LoginAuthenticationBuilder AddPasswordAuthentication <TUserManager, TUserId>(this LoginAuthenticationBuilder builder, Action <PasswordLoginOptionsBuilder> configure = null)
     where TUserManager : class, IUserManager <TUserId>
 {
     return(builder.AddPasswordAuthentication <TUserManager, TUserId, PasswordLogin <TUserId> >(configure));
 }
 public static LoginAuthenticationBuilder AddGoogleLogin(this LoginAuthenticationBuilder builder, IConfiguration configuration)
 => builder.AddGoogleLogin(configurationBuilder => configuration.Bind(configurationBuilder));