/// <summary>
        /// Configures authentication for current application, using HTTP cookies.
        /// Registers required components for the <see cref="AuthenticationController"/> and <see cref="AuthenticationService"/>.
        /// </summary>
        public static RhetosServiceCollectionBuilder AddAspNetFormsAuth(this RhetosServiceCollectionBuilder builder, Action <AspNetFormsAuthOptions> configureOptions = null)
        {
            builder.Services.AddOptions();
            if (configureOptions != null)
            {
                builder.Services.Configure(configureOptions);
            }

            builder.Services.AddIdentityCore <IdentityUser <Guid> >(options =>
            {
                options.Password.RequireDigit           = false;
                options.Password.RequireLowercase       = false;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase       = false;
                options.Password.RequiredLength         = 1;
                options.User.AllowedUserNameCharacters  = "";
            })
            .AddUserStore <RhetosUserStore>()
            .AddDefaultTokenProviders()
            .AddSignInManager <SignInManager <IdentityUser <Guid> > >();

            builder.Services.TryAddScoped <ISecurityStampValidator, SecurityStampValidator <IdentityUser <Guid> > >();
            builder.Services.TryAddScoped <AuthenticationService>();

            builder.AddRestApiFilters();

            builder.Services.AddAuthentication(IdentityConstants.ApplicationScheme)
            .AddCookie(IdentityConstants.ApplicationScheme, o => o.Events.OnRedirectToLogin = context =>
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                return(Task.CompletedTask);
            });

            return(builder);
        }
        /// <summary>
        /// Adds user impersonation components, including <see cref="IUserInfo"/> implementation for impersonated users and a dashboard snippet.
        /// </summary>
        public static RhetosServiceCollectionBuilder AddImpersonation(this RhetosServiceCollectionBuilder builder, Action <ImpersonationOptions> configureOptions = null)
        {
            builder.Services.AddHttpContextAccessor();

            builder.Services.AddOptions();
            if (configureOptions != null)
            {
                builder.Services.Configure(configureOptions);
            }

            builder.AddRestApiFilters();

            builder.ConfigureRhetosHost((serviceProvider, rhetosHostBuilder) =>
                                        rhetosHostBuilder.ConfigureContainer(containerBuilder =>
            {
                containerBuilder.Register(_ => serviceProvider.GetRequiredService <IHttpContextAccessor>()).SingleInstance().ExternallyOwned();
                containerBuilder.Register(_ => serviceProvider.GetRequiredService <IDataProtectionProvider>()).SingleInstance().ExternallyOwned();
                containerBuilder.Register(_ => serviceProvider.GetRequiredService <IOptions <ImpersonationOptions> >().Value).SingleInstance().ExternallyOwned();

                containerBuilder.RegisterType <RhetosAspNetCoreIdentityUser>().InstancePerMatchingLifetimeScope(UnitOfWorkScope.ScopeName);
                containerBuilder.Register <BaseAuthentication>(context => new BaseAuthentication(context.Resolve <RhetosAspNetCoreIdentityUser>())).InstancePerMatchingLifetimeScope(UnitOfWorkScope.ScopeName);
                containerBuilder.RegisterType <ImpersonationService>().InstancePerMatchingLifetimeScope(UnitOfWorkScope.ScopeName);
                containerBuilder.Register <IUserInfo>(context => context.Resolve <ImpersonationService>().GetUserInfo()).InstancePerMatchingLifetimeScope(UnitOfWorkScope.ScopeName);
            }));

            builder.Services.AddDataProtection();
            builder.Services.AddMvcCore()
            .AddApplicationPart(typeof(ImpersonationController).Assembly);

            builder.AddDashboardSnippet <ImpersonationDashboardSnippet>();

            return(builder);
        }
        /// <summary>
        /// Provides user info from the ASP.NET application to the Rhetos components.
        /// </summary>
        /// <remarks>
        /// It reads IHttpContextAccessor.HttpContext.User.Identity.Name and Identity.IsAuthenticated,
        /// and maps it to Rhetos <see cref="IUserInfo"/>.
        /// </remarks>
        public static RhetosServiceCollectionBuilder AddAspNetCoreIdentityUser(this RhetosServiceCollectionBuilder rhetosServiceCollectionBuilder)
        {
            rhetosServiceCollectionBuilder.Services.AddHttpContextAccessor();

            // not using TryAdd, allows subsequent calls to override previous ones
            rhetosServiceCollectionBuilder.Services.AddScoped <IUserInfo, RhetosAspNetCoreIdentityUser>();
            return(rhetosServiceCollectionBuilder);
        }
        /// <summary>
        /// Adds the required services for Rhetos dashboard controller.
        /// </summary>
        public static RhetosServiceCollectionBuilder AddDashboard(this RhetosServiceCollectionBuilder rhetosBuilder)
        {
            rhetosBuilder.Services
            .AddControllersWithViews()
            .AddApplicationPart(typeof(RhetosDashboardController).Assembly);

            rhetosBuilder.AddDashboardSnippet <ServerStatusSnippet>();
            rhetosBuilder.AddDashboardSnippet <InstalledPackagesSnippet>();

            return(rhetosBuilder);
        }
예제 #5
0
        /// <summary>
        /// Configures Rhetos localization so that it uses the <see cref="IStringLocalizerFactory"/> implementation registered in the <see cref="IServiceCollection"/>
        /// </summary>
        public static RhetosServiceCollectionBuilder AddHostLocalization(this RhetosServiceCollectionBuilder rhetosServiceCollectionBuilder, Action <HostLocalizerOptions> configureOptions = null)
        {
            rhetosServiceCollectionBuilder.Services.AddOptions();
            if (configureOptions != null)
            {
                rhetosServiceCollectionBuilder.Services.Configure(configureOptions);
            }
            rhetosServiceCollectionBuilder.ConfigureRhetosHost(ConfigureLocalizer);
            rhetosServiceCollectionBuilder.Services.AddSingleton <HostLocalizer>();

            return(rhetosServiceCollectionBuilder);
        }
        public static RhetosServiceCollectionBuilder AddLightDMS(this RhetosServiceCollectionBuilder builder)
        {
            builder.Services.AddScoped <LightDmsService>();

            builder.Services
            .AddControllers()
            .ConfigureApplicationPartManager(p =>
            {
                p.FeatureProviders.Add(new LightDmsApiControllerFeatureProvider());
            });

            builder.AddDashboardSnippet <LightDmdDashboardSnippet>();

            return(builder);
        }
예제 #7
0
        /// <summary>
        /// Adds Rhetos components to the host application.
        /// </summary>
        /// <remarks>
        /// The following public Rhetos components are registered to <see cref="IServiceCollection"/>:
        ///   <list type="bullet">
        ///     <item><description><see cref="IRhetosComponent{T}"/>, allows direct access to Rhetos components from host application's services.</description></item>
        ///     <item><description><see cref="RhetosHost"/>, for internal access to IoC container.</description></item>
        ///   </list>
        /// </remarks>
        /// <returns>
        /// A <see cref="RhetosServiceCollectionBuilder"/> that can be used to add additional Rhetos-specific services to <see cref="IServiceCollection"/>.
        /// </returns>
        public static RhetosServiceCollectionBuilder AddRhetosHost(
            this IServiceCollection serviceCollection,
            Action <IServiceProvider, IRhetosHostBuilder> configureRhetosHost = null)
        {
            var builder = new RhetosServiceCollectionBuilder(serviceCollection);

            builder.Services.AddOptions();

            if (configureRhetosHost != null)
            {
                builder.ConfigureRhetosHost(configureRhetosHost);
            }

            builder.Services.TryAddSingleton(serviceProvider => CreateRhetosHost(serviceProvider));
            builder.Services.TryAddScoped <RhetosScopeServiceProvider>();
            // IRhetosComponent is registered as a transient component but the value of
            // IRhetosComponent will retain its scope that is specified in the Autofac IoC container
            builder.Services.TryAddTransient(typeof(IRhetosComponent <>), typeof(RhetosComponent <>));

            return(builder);
        }
 public static RhetosServiceCollectionBuilder AddDashboardSnippet <T>(this RhetosServiceCollectionBuilder rhetosBuilder) where T : class, IDashboardSnippet
 {
     rhetosBuilder.Services.AddScoped <IDashboardSnippet, T>();
     return(rhetosBuilder);
 }
예제 #9
0
        /// <summary>
        /// Configures Rhetos logging so that it uses the host application's logging (<see cref="Logging.ILogger"/> implementation registered in the <see cref="IServiceCollection"/>).
        /// </summary>
        public static RhetosServiceCollectionBuilder AddHostLogging(this RhetosServiceCollectionBuilder rhetosServiceCollectionBuilder)
        {
            rhetosServiceCollectionBuilder.ConfigureRhetosHost(ConfigureLogProvider);

            return(rhetosServiceCollectionBuilder);
        }