颐和api

Startup.cs 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Builder;
  6. using Microsoft.AspNetCore.Hosting;
  7. using Microsoft.Extensions.Configuration;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.Extensions.Logging;
  10. using Microsoft.Extensions.Options;
  11. using Microsoft.AspNetCore.Authorization;
  12. using Api.SignToken;
  13. using Microsoft.IdentityModel.Tokens;
  14. using System.Text;
  15. using System.Security.Claims;
  16. using Microsoft.AspNetCore.Authentication.JwtBearer;
  17. using System.IdentityModel.Tokens.Jwt;
  18. using Pivotal.Discovery.Client;
  19. using NLog.Extensions.Logging;
  20. using NLog.Web;
  21. using Microsoft.AspNetCore.Mvc.Versioning;
  22. using MadRunFabric.Common.Options;
  23. using AutoMapper;
  24. using Microsoft.AspNetCore.Http.Features;
  25. using MadRunFabric.Common;
  26. namespace FileServerApi
  27. {
  28. public class Startup
  29. {
  30. public Startup(IHostingEnvironment env)
  31. {
  32. Configuration = new ConfigurationBuilder()
  33. .SetBasePath(env.ContentRootPath)
  34. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  35. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
  36. .AddEnvironmentVariables()
  37. .Build();
  38. Env = env;
  39. }
  40. public IConfiguration Configuration { get; }
  41. public IHostingEnvironment Env { get; }
  42. // This method gets called by the runtime. Use this method to add services to the container.
  43. public void ConfigureServices(IServiceCollection services)
  44. {
  45. #region Cors 配置
  46. //生产环境 的cors
  47. services.AddCors(options =>
  48. {
  49. options.AddPolicy("CorsProd",
  50. builder => builder.AllowAnyOrigin()
  51. //builder => builder.WithOrigins(Configuration["Cors"].Split(','))
  52. .AllowAnyMethod()
  53. .AllowAnyHeader()
  54. .AllowCredentials().SetPreflightMaxAge(TimeSpan.FromMinutes(30)));
  55. });
  56. //开发环境的cors
  57. services.AddCors(options =>
  58. {
  59. options.AddPolicy("CorsDev",
  60. builder => builder.AllowAnyOrigin()
  61. .AllowAnyMethod()
  62. .AllowAnyHeader()
  63. .AllowCredentials().SetPreflightMaxAge(TimeSpan.FromMinutes(30)));
  64. });
  65. #endregion
  66. #region 授权配置
  67. //读取jwt配置文件
  68. var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"].ToString()));
  69. var tokenValidationParameters = new TokenValidationParameters
  70. {
  71. ValidateIssuerSigningKey = true,
  72. IssuerSigningKey = signingKey,
  73. ValidateIssuer = true,
  74. ValidIssuer = Configuration["Jwt:Issuer"].ToString(),//发行人
  75. ValidateAudience = true,
  76. ValidAudience = Configuration["Jwt:Audience"].ToString(),//订阅人
  77. ValidateLifetime = true,
  78. ClockSkew = TimeSpan.Zero,
  79. RequireExpirationTime = true,
  80. };
  81. services.AddAuthentication(options =>
  82. {
  83. options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  84. options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  85. })
  86. .AddJwtBearer(o =>
  87. {
  88. o.RequireHttpsMetadata = false;
  89. o.TokenValidationParameters = tokenValidationParameters;
  90. o.Events = new JwtBearerEvents
  91. {
  92. OnTokenValidated = context =>
  93. {
  94. if (context.Request.Path.Value.ToString() == "/api/logout")
  95. {
  96. var token = ((context as TokenValidatedContext).SecurityToken as JwtSecurityToken).RawData;
  97. }
  98. return Task.CompletedTask;
  99. }
  100. };
  101. });
  102. #endregion
  103. #region redis配置
  104. services.AddDistributedRedisCache(options =>
  105. {
  106. options.InstanceName = Configuration["Redis:InstanceName"].ToString();
  107. options.Configuration = $"{Configuration["Redis:HostName"].ToString()}:{Configuration["Redis:Port"].ToString()},allowAdmin=true,password={Configuration["Redis:Password"].ToString()},defaultdatabase={Configuration["Redis:Defaultdatabase"].ToString()}";
  108. });
  109. #endregion
  110. services.AddSingleton<IConfiguration>(Configuration);
  111. services.AddSingleton<IHostingEnvironment>(Env);
  112. //注入授权Handler
  113. services.AddSingleton<IAuthorizationHandler, PermissionAuthorizationHandler>();
  114. services.AddSingleton<IPermissionService, PermissionService>();
  115. #region 版本控制
  116. services.AddApiVersioning(Options =>
  117. {
  118. Options.ReportApiVersions = true;//可选,为true API返回响应标头中支持的版本信息
  119. Options.ApiVersionReader = new QueryStringApiVersionReader(parameterName: "api-version");
  120. Options.AssumeDefaultVersionWhenUnspecified = true;
  121. Options.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(6, 0);
  122. });
  123. #endregion
  124. #region AutoMapper
  125. services.AddAutoMapper();
  126. #endregion
  127. services.AddMvc(options =>
  128. {
  129. options.Filters.Add<ActionFilter>();
  130. options.Filters.Add(new ExceptionFilter());
  131. }).AddJsonOptions(op => op.SerializerSettings.ContractResolver =
  132. new Newtonsoft.Json.Serialization.DefaultContractResolver());
  133. //限制上传文件大小
  134. services.Configure<FormOptions>(options =>
  135. {
  136. options.ValueLengthLimit = int.MaxValue;
  137. options.MultipartBodyLengthLimit = int.MaxValue;
  138. options.MemoryBufferThreshold = int.MaxValue;
  139. });
  140. #region Mongodb配置
  141. services.Configure<MongodbOptions>(options =>
  142. {
  143. options.ConnectionString = Configuration.GetSection("MongoConnection:ConnectionString").Value;
  144. options.Database = Configuration.GetSection("MongoConnection:Database").Value;
  145. });
  146. #endregion
  147. #region steeltoe
  148. services.AddDiscoveryClient(Configuration);
  149. #endregion
  150. }
  151. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  152. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  153. {
  154. if (env.IsProduction())
  155. {
  156. app.UseCors("CorsProd");
  157. }
  158. else
  159. {
  160. app.UseCors("CorsDev");
  161. app.UseDeveloperExceptionPage();
  162. app.UseDatabaseErrorPage();
  163. app.UseBrowserLink();
  164. }
  165. app.UseAuthentication();
  166. app.UseMvc();
  167. #region steeltoe
  168. app.UseDiscoveryClient();
  169. #endregion
  170. #region Nlog 引入
  171. loggerFactory.AddNLog();//添加NLog
  172. env.ConfigureNLog("nlog.config");//读取Nlog配置文件
  173. app.AddNLogWeb();
  174. #endregion
  175. }
  176. }
  177. }