StableVersion4.3/HL_FristAidPlatform_Service/Startup.cs

237 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HL_FristAidPlatform_Token;
using log4net;
using log4net.Config;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace HL_FristAidPlatform_Service
{
/// <summary>
/// Startup
/// </summary>
public class Startup
{
private string version = "V4.3";
/// <summary>
/// Startup
/// </summary>
/// <param name="env"></param>
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Configuration = builder.Build();
BaseConfigModel.SetBaseConfig(Configuration, env.ContentRootPath, env.WebRootPath);
}
/// <summary>
/// Configuration
/// </summary>
public IConfiguration Configuration { get; }
/// <summary>
/// ConfigureServices
/// </summary>
/// <param name="services"></param>
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
#region SignalR
services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
{
//builder.AllowAnyOrigin("http://47.112.158.86:4999").AllowAnyHeader().AllowAnyMethod().AllowCredentials();
builder.WithOrigins("http://47.112.158.86:4998", "http://47.112.158.86:5003", "http://47.112.158.86:5004", "http://47.112.158.86:51001", "http://112.53.108.22:51001", "http://112.53.108.22:51002", "https://api.map.baidu.com/geocoder", "http://47.112.158.86:5000", "http://220.170.196.249:51001/", "http://220.170.196.249:51002/")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
}));
services.AddSignalR();
services.AddControllers();
#endregion
services.AddMvc().AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
//CamelCasePropertyNamesContractResolver 驼峰命名法首字母小写。如果变量全为大写比如NAME返回的是 name
#region Swagger api 文档
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("Public", new OpenApiInfo
{
Version = version,
Title = "湖南首辰急危重症平台",
Description = "WebAPI",
});
//c.DocumentFilter<HiddenApiFilter>();
c.SwaggerDoc("QX", new OpenApiInfo { Title = "权限模块", Version = version });
c.SwaggerDoc("JC", new OpenApiInfo { Title = "基础数据模块", Version = version });
c.SwaggerDoc("XT", new OpenApiInfo { Title = "胸痛业务模块", Version = version });
c.SwaggerDoc("CZ", new OpenApiInfo { Title = "卒中业务模块", Version = version });
c.SwaggerDoc("CS", new OpenApiInfo { Title = "创伤业务模块", Version = version });
c.SwaggerDoc("YCF", new OpenApiInfo { Title = "危重孕产妇业务模块", Version = version });
c.SwaggerDoc("YQJJ", new OpenApiInfo { Title = "院前急救业务模块", Version = version });
c.SwaggerDoc("JZFZ", new OpenApiInfo { Title = "急诊分诊业务模块", Version = version });
c.SwaggerDoc("ZCGWSC", new OpenApiInfo { Title = "卒中高危筛查业务模块", Version = version });
c.SwaggerDoc("YTJ", new OpenApiInfo { Title = "一体机软件模块", Version = version });
//添加注释服务
//var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var basePath = Directory.GetCurrentDirectory();
var xmlPath = Path.Combine(basePath, "HL_FristAidPlatform_Service.xml");
var entityXmlPath = Path.Combine(basePath, "HL_FristAidPlatform_Models.xml");
var helpXmlPath = Path.Combine(basePath, "HL_FristAidPlatform_Help.xml");
c.IncludeXmlComments(xmlPath, true);
c.IncludeXmlComments(entityXmlPath, true);
c.IncludeXmlComments(helpXmlPath, true);
//添加header验证信息
//c.OperationFilter<SwaggerHeader>();
c.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference {
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] { }
}
});//添加一个必须的全局安全信息和AddSecurityDefinition方法指定的方案名称要一致这里是Bearer。
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT授权",//"JWT授权(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\"",
Name = "Authorization",//jwt默认的参数名称
In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)
Type = SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer"
});
services.AddHealthChecks();
});
#endregion
#region 认证
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
JwtAuthConfigModel jwtConfig = new JwtAuthConfigModel();
o.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,//是否验证Issuer
ValidateAudience = true,//是否验证Audience
ValidateLifetime = true,//是否验证失效时间
ClockSkew = TimeSpan.FromSeconds(30),
ValidateIssuerSigningKey = true,//是否验证SecurityKey
ValidAudience = "wr",//Audience
ValidIssuer = "API",//Issuer这两项和前面签发jwt的设置一致
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.JWTSecretKey)),//拿到SecurityKey
};
o.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});
#endregion
#region 授权
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdd", policy => policy.RequireRole("ADD").Build());
options.AddPolicy("RequireUpdate", policy => policy.RequireRole("UPDATE").Build());
options.AddPolicy("RequireGet", policy => policy.RequireRole("GET").Build());
options.AddPolicy("RequireDelete", policy => policy.RequireRole("DELETE").Build());
});
#endregion
//配置 SignalR 服务,进行依赖注入
services.AddSignalR();
//services.AddWebSocketManager();
//services.AddTimedJob();
}
/// <summary>
///
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
// 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();
}
#region Swagger
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/Public/swagger.json", "公共模块");
c.SwaggerEndpoint("/swagger/QX/swagger.json", "权限模块");
c.SwaggerEndpoint("/swagger/JC/swagger.json", "基础数据模块");
c.SwaggerEndpoint("/swagger/XT/swagger.json", "胸痛业务模块");
c.SwaggerEndpoint("/swagger/CZ/swagger.json", "卒中业务模块");
c.SwaggerEndpoint("/swagger/CS/swagger.json", "创伤业务模块");
c.SwaggerEndpoint("/swagger/YCF/swagger.json", "孕产妇业务模块");
c.SwaggerEndpoint("/swagger/YQJJ/swagger.json", "院前急救业务模块");
c.SwaggerEndpoint("/swagger/JZFZ/swagger.json", "急诊分诊务模块");
c.SwaggerEndpoint("/swagger/ZCGWSC/swagger.json", "卒中高危筛查业务模块");
c.SwaggerEndpoint("/swagger/YTJ/swagger.json", "一体机软件模块");
c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None);
});
#endregion
app.UseRouting();
//使用跨域
app.UseCors("CorsPolicy");
//认证
app.UseAuthentication();
//授权
app.UseAuthorization();
app.UseStaticFiles();
// signalr
app.UseSignalRSendMildd();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/signalr/chatHub");
});
app.UseWebSockets();
//app.MapSockets("",ServiceProvider.GetService<WebSocketMessageHandler>());
//app.UseTimedJob();
}
}
}