/// <summary> /// Add FrostAura components to the DI container. /// </summary> /// <param name="services">Application services collection.</param> /// <param name="builder">Configuration builder.</param> /// <param name="config">Application configuration.</param> /// <returns>Application services collection.</returns> public static IServiceCollection AddFrostAuraComponents(this IServiceCollection services, Action <FrostAuraApplicationConfiguration> builder, IConfiguration config) { // Create default configuration. var configuration = new FrostAuraApplicationConfiguration(); // Cascade desired options with the defaults. WireUpIdentityConfiguration(configuration, config); builder(configuration); services .AddAuthentication(config => { config.DefaultScheme = "Cookie"; config.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookie", config => { // Cookie auth configuration. }) .AddOpenIdConnect("oidc", config => { config.Authority = configuration.IdentityServerUrl; config.ClientId = configuration.AppIdentity; config.ClientSecret = configuration.AppSecret; config.SaveTokens = true; config.ResponseType = "code"; config.Events = new OpenIdConnectEvents { OnAccessDenied = context => { context.HandleResponse(); context.Response.Redirect("/"); return(Task.CompletedTask); } }; config.Scope.Add("frostaura.scopes.default"); configuration .Scopes .ForEach(s => config.Scope.Add(s)); }); // Register default form control mappings. Input.DynamicField.RegisterRendererTypeControl <string, InputText>(); Input.DynamicField.RegisterRendererTypeControl <int, InputNumber <int> >(); Input.DynamicField.RegisterRendererTypeControl <DateTime, InputDate <DateTime> >(); Input.DynamicField.RegisterRendererTypeControl <bool, InputCheckbox>(); return(services .AddScoped <IContentService, EmbeddedContentService>() .AddScoped <INavigationService, PageNavigationService>() .AddSingleton(configuration)); }
/// <summary> /// Wire up FrostAura application config. /// </summary> /// <param name="config">Running application config.</param> /// <param name="configuration">Application configuration.</param> private static void WireUpIdentityConfiguration(FrostAuraApplicationConfiguration config, IConfiguration configuration) { var identityServerUrl = configuration.GetValue <string>("Identity:Authority"); var iconName = configuration.GetValue <string>("FrostAura:IconName"); var scopes = new List <string>(); configuration .GetSection("Identity:Scopes") .Bind(scopes); config.AppIdentity = configuration.GetValue <string>("Identity:Audience"); config.AppName = configuration.GetValue <string>("Identity:Name"); config.AppIconSvgUrl = $"{identityServerUrl}/vectors/icons/{iconName}"; config.AppSecret = configuration.GetValue <string>("Identity:Secret"); config.IdentityServerUrl = identityServerUrl; config.GoogleMapsApiKey = configuration.GetValue <string>("FrostAura:GoogleMapsApiKey"); scopes .ToList() .ForEach(s => config.Scopes.Add(s)); }
/// <summary> /// Generate and add component nav items to the collection. /// </summary> /// <param name="configuration">Configuration to add to nav items to.</param> /// <returns>Chainable configuration instance.</returns> public static FrostAuraApplicationConfiguration AddComponentCatelogNavItems(this FrostAuraApplicationConfiguration configuration) { var componentNavItems = configuration .GetType() .Assembly .GetTypes() .Where(t => !t.IsAbstract && !t.IsInterface) .Where(t => t.BaseType.IsGenericType) .Where(t => t.BaseType.GetGenericTypeDefinition() == typeof(BaseComponent <object>).GetGenericTypeDefinition()) .OrderBy(t => t.Name) .Select(t => new NavLink { IconCssClass = "fa fa-cube", Title = t.Name, Path = $"/component/{t.FullName}" }); configuration.NavigationItems.AddRange(componentNavItems); return(configuration); }