using Serilog; namespace Microsoft.eShopOnContainers.Services.Identity.API; public static class ProgramExtensions { private const string AppName = "Identity API"; public static void AddCustomConfiguration(this WebApplicationBuilder builder) { builder.Configuration.AddConfiguration(GetConfiguration()).Build(); } public static void AddCustomSerilog(this WebApplicationBuilder builder) { var seqServerUrl = builder.Configuration["SeqServerUrl"]; var logstashUrl = builder.Configuration["LogstashgUrl"]; Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://localhost:8080" : logstashUrl, null) .ReadFrom.Configuration(builder.Configuration) .CreateLogger(); builder.Host.UseSerilog(); } public static void AddCustomMvc(this WebApplicationBuilder builder) { builder.Services.AddControllersWithViews(); builder.Services.AddControllers(); builder.Services.AddRazorPages(); } public static void AddCustomDatabase(this WebApplicationBuilder builder) => builder.Services.AddDbContext( options => options.UseSqlServer(builder.Configuration.GetConnectionString("IdentityDb"))); public static void AddCustomIdentity(this WebApplicationBuilder builder) { builder.Services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); } public static void AddCustomIdentityServer(this WebApplicationBuilder builder) { var identityServerBuilder = builder.Services.AddIdentityServer(options => { options.IssuerUri = "null"; options.Authentication.CookieLifetime = TimeSpan.FromHours(2); options.Events.RaiseErrorEvents = true; options.Events.RaiseInformationEvents = true; options.Events.RaiseFailureEvents = true; options.Events.RaiseSuccessEvents = true; }) .AddInMemoryIdentityResources(Config.GetResources()) .AddInMemoryApiScopes(Config.GetApiScopes()) .AddInMemoryApiResources(Config.GetApis()) .AddInMemoryClients(Config.GetClients(builder.Configuration)) .AddAspNetIdentity(); // not recommended for production - you need to store your key material somewhere secure identityServerBuilder.AddDeveloperSigningCredential(); } public static void AddCustomAuthentication(this WebApplicationBuilder builder) { builder.Services.AddAuthentication(); } public static void AddCustomHealthChecks(this WebApplicationBuilder builder) { builder.Services.AddHealthChecks() .AddCheck("self", () => HealthCheckResult.Healthy()) .AddSqlServer(builder.Configuration.GetConnectionString("IdentityDb"), name: "IdentityDB-check", tags: new string[] { "IdentityDB" }); } public static void AddCustomApplicationServices(this WebApplicationBuilder builder) { builder.Services.AddTransient(); builder.Services.AddTransient, EFLoginService>(); builder.Services.AddTransient(); } static IConfiguration GetConfiguration() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); var config = builder.Build(); if (config.GetValue("UseVault", false)) { TokenCredential credential = new ClientSecretCredential( config["Vault:TenantId"], config["Vault:ClientId"], config["Vault:ClientSecret"]); builder.AddAzureKeyVault(new Uri($"https://{config["Vault:Name"]}.vault.azure.net/"), credential); } return builder.Build(); } }