using System.IO; using System.Security.Cryptography.X509Certificates; using Dough.IdentityServer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Dough.Models; using Dough.Models.Database; using Dough.Services; using IdentityServer4.Configuration; using Microsoft.AspNetCore.DataProtection; namespace Dough { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } private const string DefaultCorsPolicy = "DefaultCorsPolicy"; private string GetConnectionStringFromEnvironment() { var host = Configuration.GetValue("DB_HOST"); var port = Configuration.GetValue("DB_PORT"); var user = Configuration.GetValue("DB_USER"); var password = Configuration.GetValue("DB_PASSWORD"); var name = Configuration.GetValue("DB_NAME"); return $"Server={host},{port};Database={name};User={user};Password={password}"; } private X509Certificate2 GetSigningCredentialFromPfx(string fileName) { var path = Path.Combine(Directory.GetCurrentDirectory(), "AppData", fileName); return new X509Certificate2(path, string.Empty); } public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy(DefaultCorsPolicy, builder => { builder .WithOrigins(Constants.BrowserAppUrls) .AllowAnyHeader() .AllowAnyMethod(); }); }); var dataprotectionkeyPath = Path.Combine(Directory.GetCurrentDirectory(), "AppData", "dpkeys"); services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(dataprotectionkeyPath)); services.AddHealthChecks() .AddDbContextCheck(); services.AddDbContext(options => { options.UseMySql(GetConnectionStringFromEnvironment()); }); services.AddIdentityServer(options => { options.UserInteraction = new UserInteractionOptions { LoginUrl = "/login", ErrorUrl = "/error", }; }) .AddInMemoryIdentityResources(Config.IdentityResources) .AddInMemoryApiScopes(Config.ApiScopes) .AddSigningCredential(GetSigningCredentialFromPfx("example.pfx")) .AddValidationKey(GetSigningCredentialFromPfx("example2.pfx")) .AddProfileService() .AddInMemoryClients(Config.Clients); services.AddSingleton(); services.AddControllers(); services.AddRazorPages().AddRazorRuntimeCompilation(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseStaticFiles(); app.UseCors(DefaultCorsPolicy); app.UseHealthChecks("/health"); app.UseStatusCodePages(); app.UseIdentityServer(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllers() .RequireAuthorization(); }); } } }