using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Props.Data; using Props.Models; namespace Props { public class Startup { public Startup(IConfiguration configuration, IHostEnvironment environment) { Configuration = configuration; Environment = environment; } public IConfiguration Configuration { get; } public IHostEnvironment Environment { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => { options.UseLazyLoadingProxies(); options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")); }); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores(); services.AddIdentityServer() .AddApiAuthorization( options => { options.Clients.AddIdentityServerSPA("Props", spa => { spa.WithRedirectUri("/silent/login-callback"); spa.WithRedirectUri("/authentication/login-callback"); spa.WithLogoutRedirectUri("/authentication/logout-callback"); }); }); services.AddAuthentication() .AddIdentityServerJwt(); services.AddControllersWithViews(); services.AddRazorPages(); services.AddSpaStaticFiles(configuration => { configuration.RootPath = "client/dist"; }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } if (!env.IsDevelopment()) app.UseHttpsRedirection(); app.UseStaticFiles(); if (!env.IsDevelopment()) app.UseSpaStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseIdentityServer(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); app.UseSpa(spa => { spa.Options.SourcePath = "../client"; // "May not exist in published applications" - https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.spaservices.spaoptions.sourcepath?view=aspnetcore-5.0#Microsoft_AspNetCore_SpaServices_SpaOptions_SourcePath if (env.IsDevelopment()) { spa.UseProxyToSpaDevelopmentServer(Configuration["SPA:BaseUri"]); } }); } } }