using Bootstrap.DataAccess; using Bootstrap.Security.Filter; using Longbow.Web; using Longbow.Web.SignalR; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Swashbuckle.AspNetCore.Swagger; using System; using System.IO; using System.Text.Encodings.Web; using System.Text.Unicode; namespace Bootstrap.Admin { /// /// /// public class Startup { /// /// /// /// public Startup(IConfiguration configuration) { Configuration = configuration; } /// /// /// public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. /// /// /// /// public void ConfigureServices(IServiceCollection services) { services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.Configure(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddCors(); services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionsHelper.Log)); services.AddConfigurationManager(Configuration); services.AddCacheManager(Configuration); services.AddDbAdapter(); services.AddIPLocator(DictHelper.ConfigIPLocator); services.AddOnlineUsers(); var dataProtectionBuilder = services.AddDataProtection(op => op.ApplicationDiscriminator = Configuration["ApplicationDiscriminator"]) .SetApplicationName(Configuration["ApplicationName"]) .PersistKeysToFileSystem(new DirectoryInfo(Configuration["KeyPath"])); if (Configuration["DisableAutomaticKeyGeneration"] == "True") dataProtectionBuilder.DisableAutomaticKeyGeneration(); services.AddSignalR().AddJsonProtocalDefault(); services.AddSignalRExceptionFilterHandler(async (client, ex) => await SignalRManager.Send(client, ex)); services.AddResponseCompression(); services.AddMvc(options => { options.Filters.Add(); options.Filters.Add(); options.Filters.Add>(); }).AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; JsonConvert.DefaultSettings = () => options.SerializerSettings; }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => options.Cookie.Path = "/"); services.AddApiVersioning(option => { option.DefaultApiVersion = new ApiVersion(1, 0); option.ReportApiVersions = true; option.AssumeDefaultVersionWhenUnspecified = true; option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version")); }); services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new Info { Version = "v1", Title = "BootstrapAdmin API" }); //Set the comments path for the swagger json and ui. var xmlPath = Path.Combine(AppContext.BaseDirectory, "Bootstrap.Admin.xml"); options.IncludeXmlComments(xmlPath); options.OperationFilter(); // 添加httpHeader参数 }); services.AddButtonAuthorization(MenuHelper.AuthorizateButtons); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. /// /// /// /// /// public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseStatusCodePagesWithReExecute("/Home/Error/{0}"); app.UseCors(builder => builder.WithOrigins(Configuration["AllowOrigins"].Split(',', StringSplitOptions.RemoveEmptyEntries)).AllowAnyHeader().AllowAnyMethod().AllowCredentials()); app.UseHttpsRedirection(); app.UseResponseCompression(); app.UseStaticFiles(); app.UseAuthentication(); app.UseBootstrapAdminAuthorization(RoleHelper.RetrieveRolesByUserName, RoleHelper.RetrieveRolesByUrl, AppHelper.RetrievesByUserName); app.UseOnlineUsers(callback: TraceHelper.Save); app.UseCacheManagerCorsHandler(); app.UseSignalR(routes => { routes.MapHub("/NotiHub"); }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); app.UseWhen(context => context.Request.Path.StartsWithSegments("/swagger"), builder => { builder.Use(async (context, next) => { if (!context.User.Identity.IsAuthenticated) await context.ChallengeAsync(); else await next(); }); }); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint($"{Configuration["SwaggerPathBase"]}/swagger/v1/swagger.json", "BootstrapAdmin API V1"); }); } } }