using Microsoft.AspNetCore.Authentication.Cookies; 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.Utilities; using Dough.Models.Database; using Microsoft.AspNetCore.CookiePolicy; using Microsoft.AspNetCore.Http; namespace Dough { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } private const string MainCorsPolicy = "MainCorsPolicy"; 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(MainCorsPolicy, builder => { builder .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() .WithOrigins("http://localhost:8080"); }); }); services.AddDbContext(options => { options.UseMySql(GetConnectionStringFromEnvironment(), settings => { settings.EnableRetryOnFailure(3); }); }); services.AddControllers(); services.AddAuthentication(Constants.AuthenticationScheme) .AddCookie(Constants.AuthenticationScheme, options => { options.Cookie.Name = "dough_session"; options.Cookie.HttpOnly = true; options.Cookie.SameSite = SameSiteMode.Strict; options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; options.LoginPath = "/api/account/login"; options.SlidingExpiration = true; options.LogoutPath = "/api/account/logout"; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseCors(MainCorsPolicy); app.UseRouting(); app.UseStatusCodePages(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }