Program.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Hangfire;
  2. using Hangfire.Redis.StackExchange;
  3. using HTEX.Complex.Service;
  4. using HTEX.Complex.Service.AzureRedis;
  5. using Microsoft.AspNetCore.Authentication.JwtBearer;
  6. using Microsoft.Extensions.DependencyInjection.Extensions;
  7. using Microsoft.IdentityModel.Tokens;
  8. using System.IdentityModel.Tokens.Jwt;
  9. using TEAMModelOS.SDK;
  10. using TEAMModelOS.SDK.DI;
  11. using TEAMModelOS.SDK.DI.AzureCosmos3;
  12. namespace HTEX.Complex
  13. {
  14. public class Program
  15. {
  16. public static void Main(string[] args)
  17. {
  18. var builder = WebApplication.CreateBuilder(args);
  19. // Add services to the container.
  20. JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
  21. builder.Services.AddAuthentication(options => options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme)
  22. .AddJwtBearer(options => //AzureADJwtBearer
  23. {
  24. //options.SaveToken = true; //驗證令牌由服務器生成才有效,不適用於服務重啟或分布式架構
  25. options.Authority ="https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0";// builder.Configuration["Option:Authority"];
  26. options.Audience = "72643704-b2e7-4b26-b881-bd5865e7a7a5";//builder.Configuration["Option:Audience"];
  27. options.RequireHttpsMetadata = true;
  28. options.TokenValidationParameters = new TokenValidationParameters
  29. {
  30. RoleClaimType = "roles",
  31. //ValidAudiences = new string[] { builder.Configuration["Option:Audience"], $"api://{builder.Configuration["Option:Audience"]}" }
  32. ValidAudiences = new string[] { "72643704-b2e7-4b26-b881-bd5865e7a7a5", $"api://72643704-b2e7-4b26-b881-bd5865e7a7a5" }
  33. };
  34. options.Events = new JwtBearerEvents();
  35. //下列事件有需要紀錄則打開
  36. //options.Events.OnMessageReceived = async context => { await Task.FromResult(0); };
  37. //options.Events.OnForbidden = async context => { await Task.FromResult(0); };
  38. //options.Events.OnChallenge = async context => { await Task.FromResult(0); };
  39. //options.Events.OnAuthenticationFailed = async context => { await Task.FromResult(0); };
  40. options.Events.OnTokenValidated = async context =>
  41. {
  42. if (!context.Principal.Claims.Any(x => x.Type.Equals("http://schemas.microsoft.com/identity/claims/scope")) //ClaimConstants.Scope
  43. && !context.Principal.Claims.Any(y => y.Type.Equals("roles"))) //ClaimConstants.Roles //http://schemas.microsoft.com/ws/2008/06/identity/claims/role
  44. {
  45. //TODO 需處理額外授權非角色及範圍的訪問異常紀錄
  46. throw new UnauthorizedAccessException("Neither scope or roles claim was found in the bearer token.");
  47. }
  48. await Task.FromResult(0);
  49. };
  50. });
  51. builder.Services.AddControllers();
  52. #if DEBUG
  53. builder.WebHost.UseUrls(new[] { "https://*:7298" });
  54. #endif
  55. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  56. builder.Services.AddEndpointsApiExplorer();
  57. //builder.Services.AddSwaggerGen();
  58. builder.Services.AddHttpClient();
  59. string StorageConnectionString = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString");
  60. string StorageConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString-Test");
  61. //string ServiceBusConnectionString = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString");
  62. //string ServiceBusConnectionStringTest = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString-Test");
  63. string RedisConnectionString = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString");
  64. string RedisConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString-Test");
  65. string CosmosConnectionString = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString");
  66. string CosmosConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString-Test");
  67. //Storage
  68. builder.Services.AddAzureStorage(StorageConnectionString, "Default");
  69. builder.Services.AddAzureStorage(StorageConnectionStringTest, "Test");
  70. //ServiceBus
  71. //builder.Services.AddAzureServiceBus(ServiceBusConnectionString, "Default");
  72. //builder.Services.AddAzureServiceBus(ServiceBusConnectionStringTest, "Test");
  73. //Redis
  74. builder.Services.AddAzureRedis(RedisConnectionString, "Default");
  75. builder.Services.AddAzureRedis(RedisConnectionStringTest, "Test");
  76. //Cosmos
  77. builder.Services.AddAzureCosmos3(CosmosConnectionString, "Default");
  78. builder.Services.AddAzureCosmos3(CosmosConnectionStringTest, "Test");
  79. builder.Services.AddHttpContextAccessor();
  80. builder.Services.AddHttpClient<DingDing>();
  81. string path = $"{builder.Environment.ContentRootPath}/JsonFiles";
  82. builder.Services.TryAddSingleton(new Region2LongitudeLatitudeTranslator(path));
  83. builder.Services.AddIPSearcher(path);
  84. builder.Services.AddCors(options =>
  85. {
  86. options.AddDefaultPolicy(
  87. builder =>
  88. {
  89. builder.AllowAnyOrigin()
  90. .AllowAnyHeader()
  91. .AllowAnyMethod();
  92. });
  93. });
  94. builder.Services.AddHangfire(config => {
  95. config.UseRedisStorage(builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString"));
  96. });
  97. builder.Services.AddHangfireServer();
  98. builder.Services.AddControllersWithViews();
  99. var app = builder.Build();
  100. // Configure the HTTP request pipeline.
  101. if (!app.Environment.IsDevelopment())
  102. {
  103. app.UseExceptionHandler("/Home/Error");
  104. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  105. app.UseHsts();
  106. }
  107. app.UseHttpsRedirection();
  108. app.UseStaticFiles();
  109. app.UseRouting();
  110. app.UseCors(); //使用跨域設定
  111. app.UseHttpsRedirection(); //開發中暫時關掉
  112. app.UseAuthentication();
  113. app.UseAuthorization();
  114. app.MapControllerRoute(
  115. name: "default",
  116. pattern: "{controller=Home}/{action=Index}/{id?}");
  117. app.Run();
  118. }
  119. }
  120. }