// Copyright (c) Jan Škoruba. All Rights Reserved. // Licensed under the Apache License, Version 2.0. using System.IdentityModel.Tokens.Jwt; using HealthChecks.UI.Client; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NSwag.AspNetCore; using Skoruba.AuditLogging.EntityFramework.Entities; using LiteCharmsSecurity.Admin.Api.Configuration; using Skoruba.Duende.IdentityServer.Admin.EntityFramework.Configuration.Configuration; using LiteCharmsSecurity.Admin.EntityFramework.Shared.DbContexts; using LiteCharmsSecurity.Admin.EntityFramework.Shared.Entities.Identity; using Skoruba.Duende.IdentityServer.Admin.UI.Api.Configuration; using Skoruba.Duende.IdentityServer.Admin.UI.Api.Helpers; using Skoruba.Duende.IdentityServer.Shared.Configuration.Helpers; using LiteCharmsSecurity.Shared.Dtos; using LiteCharmsSecurity.Shared.Dtos.Identity; using StartupHelpers = Skoruba.Duende.IdentityServer.Shared.Configuration.Helpers.StartupHelpers; namespace LiteCharmsSecurity.Admin.Api { public class Startup { public Startup(IWebHostEnvironment env, IConfiguration configuration) { JwtSecurityTokenHandler.DefaultMapInboundClaims = false; HostingEnvironment = env; Configuration = configuration; } public IConfiguration Configuration { get; } public IWebHostEnvironment HostingEnvironment { get; } public void ConfigureServices(IServiceCollection services) { var adminApiConfiguration = Configuration.GetSection(nameof(AdminApiConfiguration)).Get(); services.AddSingleton(adminApiConfiguration); var databaseProviderConfiguration = Configuration.GetSection(nameof(DatabaseProviderConfiguration)).Get(); var databaseMigration = StartupHelpers.GetDatabaseMigrationsConfiguration(Configuration, MigrationAssemblyConfiguration.GetMigrationAssemblyByProvider(databaseProviderConfiguration)); // Add DbContexts RegisterDbContexts(services, databaseMigration); // Add email senders which is currently setup for SendGrid and SMTP services.AddEmailSenders(Configuration); // Add authentication services RegisterAuthentication(services); // Add authorization services RegisterAuthorization(services); services.AddIdentityServerAdminApi(Configuration, adminApiConfiguration); services.AddSwaggerServices(adminApiConfiguration); services.AddIdSHealthChecks(Configuration, adminApiConfiguration); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AdminApiConfiguration adminApiConfiguration) { app.AddForwardHeaders(Configuration); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseOpenApi(); app.UseSwaggerUi(settings => { settings.OAuth2Client = new OAuth2ClientSettings { ClientId = adminApiConfiguration.OidcSwaggerUIClientId, AppName = adminApiConfiguration.ApiName, UsePkceWithAuthorizationCodeGrant = true, ClientSecret = null }; }); app.UseRouting(); UseAuthentication(app); app.UseCors(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHealthChecks("/health", new HealthCheckOptions { ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); }); } public virtual void RegisterDbContexts(IServiceCollection services, DatabaseMigrationsConfiguration databaseMigration) { services.AddDbContexts(Configuration, databaseMigration); } public virtual void RegisterAuthentication(IServiceCollection services) { services.AddApiAuthentication(Configuration); } public virtual void RegisterAuthorization(IServiceCollection services) { services.AddAuthorizationPolicies(); } public virtual void UseAuthentication(IApplicationBuilder app) { app.UseAuthentication(); } } }