using FluentValidation.AspNetCore; using Microsoft.AspNetCore.Authentication.JwtBearer; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using ZeroFramework.DeviceCenter.Application; using ZeroFramework.DeviceCenter.Domain; using ZeroFramework.DeviceCenter.Infrastructure; [assembly: HostingStartup(typeof(ZeroFramework.DeviceCenter.API.Extensions.Hosting.CustomHostingStartup))] namespace ZeroFramework.DeviceCenter.API.Extensions.Hosting { public class CustomHostingStartup : IHostingStartup { public void Configure(IWebHostBuilder builder) { builder.ConfigureServices((context, services) => { services.AddFluentValidationAutoValidation(); services.AddDomainLayer(); services.AddInfrastructureLayer(context.Configuration); services.AddApplicationLayer(context.Configuration); services.AddWebApiLayer(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.TryAdd(nameof(ClaimTypes.Name).ToLower(), ClaimTypes.Name); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.Authority = context.Configuration.GetValue("IdentityServer:AuthorizationUrl"); options.RequireHttpsMetadata = false; options.TokenValidationParameters.ValidateAudience = false; options.TokenValidationParameters.NameClaimType = ClaimTypes.Name; }); services.AddCors(options => { string[]? allowedOrigins = context.Configuration.GetSection("AllowedOrigins").Get(); if (allowedOrigins is not null) { options.AddDefaultPolicy(builder => builder.WithOrigins(allowedOrigins).AllowAnyMethod().AllowAnyHeader().AllowCredentials()); } }); string[] supportedCultures = new[] { "zh-CN", "en-US" }; services.AddRequestLocalization(options => { options.ApplyCurrentCultureToResponseHeaders = false; options.SetDefaultCulture(supportedCultures.First()); options.AddSupportedCultures(supportedCultures); options.AddSupportedUICultures(supportedCultures); }); services.Configure(context.Configuration); services.Configure(options => { options.ModelBinderProviders.Add(new ModelBinding.SortingBinderProvider()); options.Filters.Add(); }); }); } } }