Program.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using Autofac;
  2. using Autofac.Extensions.DependencyInjection;
  3. using Long.Common;
  4. using Long.Core.Middleware;
  5. using Long.Dapper;
  6. using Long.Service;
  7. using Long.Utils.Converter;
  8. using Long.Utils.Filter;
  9. using Microsoft.AspNetCore.Authentication.JwtBearer;
  10. using Microsoft.OpenApi.Models;
  11. using System.Reflection;
  12. var builder = WebApplication.CreateBuilder(args);
  13. // Add services to the container.
  14. builder.Services.AddControllers();
  15. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  16. builder.Services.AddEndpointsApiExplorer();
  17. builder.Services.AddSwaggerGen(options =>
  18. {
  19. options.SwaggerDoc("v1", new OpenApiInfo { Title = "Long API", Version = "v1" });
  20. //为 Swagger JSON and UI设置xml文档注释路径
  21. var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
  22. var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
  23. options.IncludeXmlComments(xmlPath);
  24. options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
  25. {
  26. Scheme = JwtBearerDefaults.AuthenticationScheme,
  27. BearerFormat = "JWT",
  28. In = ParameterLocation.Header,
  29. Name = "Authorization",
  30. Type = SecuritySchemeType.ApiKey,
  31. Description = "Bearer Token"
  32. });
  33. options.AddSecurityRequirement(new OpenApiSecurityRequirement
  34. {
  35. {
  36. new OpenApiSecurityScheme
  37. {
  38. Reference = new OpenApiReference
  39. {
  40. Type = ReferenceType.SecurityScheme,
  41. Id = "Bearer"
  42. }
  43. },
  44. Array.Empty<string>()
  45. }
  46. });
  47. });
  48. // 配置跨域访问
  49. var origins = builder.Configuration.GetSection("Cors:Origins").GetChildren().Select(x => x.Value ?? "").ToArray();
  50. builder.Services.AddCors(c =>
  51. {
  52. c.AddPolicy("cors", policy =>
  53. {
  54. policy.AllowAnyHeader();
  55. policy.AllowAnyMethod();
  56. policy.AllowCredentials();
  57. policy.WithOrigins(origins ?? Array.Empty<string>());
  58. });
  59. });
  60. // 配置 ids
  61. var authority = builder.Configuration["JWT:Authority"];
  62. var scheme = "Bearer";
  63. builder.Services.AddAuthentication(scheme).AddJwtBearer(scheme, options =>
  64. {
  65. options.Authority = authority;
  66. options.RequireHttpsMetadata = false;
  67. options.Audience = "LongApi";
  68. options.TokenValidationParameters.ValidateIssuer = false;
  69. });
  70. builder.Services.AddAuthorization(options =>
  71. {
  72. options.AddPolicy("GuestApi", policy =>
  73. {
  74. policy.RequireClaim("scope", IdsScope.GuestApi);
  75. });
  76. options.AddPolicy("UserApi", policy =>
  77. {
  78. policy.RequireAuthenticatedUser();
  79. policy.RequireClaim("scope", IdsScope.UserApi);
  80. });
  81. options.AddPolicy("AdminApi", policy =>
  82. {
  83. policy.RequireAuthenticatedUser();
  84. policy.RequireClaim("scope", IdsScope.AdminApi);
  85. });
  86. });
  87. // 配置 Cookie
  88. builder.Services.Configure<CookiePolicyOptions>(options =>
  89. {
  90. options.CheckConsentNeeded = context => true;
  91. options.MinimumSameSitePolicy = SameSiteMode.None;
  92. });
  93. // 配置其他
  94. builder.Services.AddMvc(options => { options.Filters.Add<ApiExceptionFilter>(); })
  95. .AddControllersAsServices()
  96. .AddJsonOptions(opt =>
  97. {
  98. opt.JsonSerializerOptions.PropertyNamingPolicy = null;
  99. opt.JsonSerializerOptions.Converters.Add(new LongJsonConverter());
  100. });
  101. // 配置自动注册服务
  102. builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(c =>
  103. {
  104. c.RegisterModule(new ServiceModule());
  105. });
  106. var app = builder.Build();
  107. // Configure the HTTP request pipeline.
  108. if (app.Environment.IsDevelopment())
  109. {
  110. DatabaseConfig.AppSettingsFileName = "appsettings.Development.json";
  111. }
  112. app.UseSwagger();
  113. app.UseSwaggerUI();
  114. app.UseCors("cors");
  115. app.UseHttpsRedirection();
  116. app.UseAuthentication();
  117. app.UseAuthorization();
  118. app.MapControllers();
  119. // 全局错误捕获
  120. app.UseLongExtensionMiddleware();
  121. app.Run();