using System.IO; 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; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; 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", "3306"); 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}"; } public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy(DefaultCorsPolicy, builder => { builder .WithOrigins(Constants.BrowserAppUrls) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); 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) .AddDeveloperSigningCredential() .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.UseCors(DefaultCorsPolicy); app.UseHealthChecks("/health"); app.UseStatusCodePages(); app.UseIdentityServer(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllers() .RequireAuthorization(); }); } } }