using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using isnd.Data; using isnd.Interfaces; using isnd.Services; using isnd.Entities; using isnd.Authorization; using isnd.Data.Roles; using Microsoft.AspNetCore.Authorization; using Unleash; using Microsoft.Extensions.Options; using isnd.Helpers; using Microsoft.IdentityModel.Tokens; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace isnd { public class Startup { public Startup(IConfiguration config) { Configuration = config; } public static IConfiguration Configuration { get; private set; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var smtpSettingsconf = Configuration.GetSection("Smtp"); var isndSettingsconf = Configuration.GetSection("Isn"); var adminStartupListConf = Configuration.GetSection("AdminList"); var unleashConf = Configuration.GetSection("Unleash"); services.Configure(smtpSettingsconf) .Configure(isndSettingsconf) .Configure(adminStartupListConf) .Configure(unleashConf) .Configure(o => o.Path = "~/migrate") .AddDbContext(options => options.UseNpgsql( Configuration.GetConnectionString("DefaultConnection"))) .AddIdentity() .AddRoles() .AddEntityFrameworkStores() .AddSignInManager() .AddDefaultUI() .AddDefaultTokenProviders(); /* services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; }); */ services.AddMvc(); services.AddDataProtection(); services.AddAuthorization(options => { options.AddPolicy(IsndConstants.RequireAdminPolicyName, policy => policy.RequireRole(IsndConstants.AdministratorRoleName)); options.AddPolicy(IsndConstants.RequireValidApiKey, policy => policy.Requirements.Add(new ValidApiKeyRequirement())); }) .AddTransient() .AddTransient() .AddTransient() .AddSingleton() .AddSingleton(s => { var config = s.GetRequiredService>(); if (config.Value==null) throw new System.Exception("No unleash client settings"); if (config.Value.ApiUrl==null) throw new System.Exception("No unleash client ApiUrl"); if (config.Value.ClientApiKey==null) throw new System.Exception("No unleash client ClientApiKey"); return s.GetRequiredService().CreateUnleahClient(config.Value); }); services.AddAuthentication("Bearer") .AddJwtBearer("Bearer", options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false }; }); } public static IUnleash UnleashClient { get; private set; } public static string ExternalAddress { get; internal set; } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext dbContext) { // app.UseForwardedHeaders(); // app.UseDeveloperExceptionPage(); // app.UseHttpsRedirection(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); dbContext.Database.Migrate(); } _ = app .UseStaticFiles() .UseAuthentication() .UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}"); }); } } }