Program.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using HTEXGpt.Services;
  2. using Microsoft.AspNetCore.Authentication.JwtBearer;
  3. using Microsoft.Extensions.DependencyInjection.Extensions;
  4. using Microsoft.IdentityModel.Tokens;
  5. using System.IdentityModel.Tokens.Jwt;
  6. using System.Net.WebSockets;
  7. using TEAMModelOS.SDK.DI;
  8. using Hangfire;
  9. using Hangfire.Dashboard.BasicAuthorization;
  10. using Hangfire.Redis.StackExchange;
  11. using HTEXScreen.Service.CoreHangfire;
  12. using HTEXScreen.Service;
  13. using TEAMModelOS.SDK;
  14. namespace HTEX.Screen
  15. {
  16. public class Program
  17. {
  18. public static void Main(string[] args)
  19. {
  20. var builder = WebApplication.CreateBuilder(args);
  21. // Add services to the container.
  22. JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
  23. builder.Services.AddAuthentication(options => options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme)
  24. .AddJwtBearer(options => //AzureADJwtBearer
  25. {
  26. //options.SaveToken = true; //驗證令牌由服務器生成才有效,不適用於服務重啟或分布式架構
  27. options.Authority ="https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0";// builder.Configuration["Option:Authority"];
  28. options.Audience = "72643704-b2e7-4b26-b881-bd5865e7a7a5";//builder.Configuration["Option:Audience"];
  29. options.RequireHttpsMetadata = true;
  30. options.TokenValidationParameters = new TokenValidationParameters
  31. {
  32. RoleClaimType = "roles",
  33. //ValidAudiences = new string[] { builder.Configuration["Option:Audience"], $"api://{builder.Configuration["Option:Audience"]}" }
  34. ValidAudiences = new string[] { "72643704-b2e7-4b26-b881-bd5865e7a7a5", $"api://72643704-b2e7-4b26-b881-bd5865e7a7a5" }
  35. };
  36. options.Events = new JwtBearerEvents();
  37. //下列事件有需要紀錄則打開
  38. //options.Events.OnMessageReceived = async context => { await Task.FromResult(0); };
  39. //options.Events.OnForbidden = async context => { await Task.FromResult(0); };
  40. //options.Events.OnChallenge = async context => { await Task.FromResult(0); };
  41. //options.Events.OnAuthenticationFailed = async context => { await Task.FromResult(0); };
  42. options.Events.OnTokenValidated = async context =>
  43. {
  44. if (!context.Principal.Claims.Any(x => x.Type.Equals("http://schemas.microsoft.com/identity/claims/scope")) //ClaimConstants.Scope
  45. && !context.Principal.Claims.Any(y => y.Type.Equals("roles"))) //ClaimConstants.Roles //http://schemas.microsoft.com/ws/2008/06/identity/claims/role
  46. {
  47. //TODO 需處理額外授權非角色及範圍的訪問異常紀錄
  48. throw new UnauthorizedAccessException("Neither scope or roles claim was found in the bearer token.");
  49. }
  50. await Task.FromResult(0);
  51. };
  52. });
  53. builder.Services.AddControllers();
  54. #if DEBUG
  55. builder.WebHost.UseUrls(new[] { "https://*:7298" });
  56. #endif
  57. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  58. builder.Services.AddEndpointsApiExplorer();
  59. //builder.Services.AddSwaggerGen();
  60. builder.Services.AddHttpClient();
  61. string StorageConnectionString = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString");
  62. string StorageConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString-Test");
  63. string ServiceBusConnectionString = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString");
  64. string ServiceBusConnectionStringTest = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString-Test");
  65. string RedisConnectionString = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString");
  66. string RedisConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString-Test");
  67. string CosmosConnectionString = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString");
  68. string CosmosConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString-Test");
  69. //Storage
  70. builder.Services.AddAzureStorage(StorageConnectionString, "Default");
  71. builder.Services.AddAzureStorage(StorageConnectionStringTest, "Test");
  72. //ServiceBus
  73. builder.Services.AddAzureServiceBus(ServiceBusConnectionString, "Default");
  74. builder.Services.AddAzureServiceBus(ServiceBusConnectionStringTest, "Test");
  75. //Redis
  76. builder.Services.AddAzureRedis(RedisConnectionString, "Default");
  77. builder.Services.AddAzureRedis(RedisConnectionStringTest, "Test");
  78. //Cosmos
  79. builder.Services.AddAzureCosmos(CosmosConnectionString, "Default");
  80. builder.Services.AddAzureCosmos(CosmosConnectionStringTest, "Test");
  81. builder.Services.AddHostedService<ScreenPDFSub>();
  82. builder.Services.AddHostedService<ScreenPDFSubTest>();
  83. builder.Services.AddHttpContextAccessor();
  84. builder.Services.AddHttpClient<DingDing>();
  85. string path = $"{builder.Environment.ContentRootPath}/JsonFiles";
  86. builder.Services.TryAddSingleton(new Region2LongitudeLatitudeTranslator(path));
  87. builder.Services.AddIPSearcher(path);
  88. builder.Services.AddScoped<IAiAppService, AiAppServiceImpl>();
  89. builder.Services.AddScoped<SparkDeskServiceImpl>();
  90. builder.Services.AddScoped<QianWenServiceImpl>();
  91. builder.Services.AddScoped<ErnieBotServiceImpl>();
  92. builder.Services.AddScoped<ClientWebSocket>();
  93. builder.Services.AddScoped<ChatGlmServiceImpl>();
  94. builder.Services.AddHttpClient();
  95. builder.Services.AddCors(options =>
  96. {
  97. options.AddPolicy("MyAllowSpecificOrigins",
  98. builder =>
  99. {
  100. builder.WithOrigins("http://teammodelos-test.chinacloudsites.cn",
  101. "https://www.teammodel.cn", "https://localhost:5001",
  102. "http://localhost:5000", "http://localhost:64524",
  103. "https://localhost:44341", "https://localhost:8888", "http://localhost:8888", "https://localhost:8081", "http://localhost:8081")
  104. .AllowAnyHeader()
  105. .AllowAnyMethod();
  106. });
  107. });
  108. // 添加CORS服务
  109. builder.Services.AddCors(options =>
  110. {
  111. options.AddPolicy("AllowSpecificOrigin", builder =>
  112. {
  113. #if DEBUG
  114. builder.AllowAnyOrigin() // 添加允许的源
  115. .AllowAnyHeader() // 允许任何请求标头
  116. // .AllowCredentials()
  117. ; // 允许包含凭据
  118. #else
  119. //builder.WithOrigins("https://teammodeltest.blob.core.chinacloudapi.cn", "https://teammodelos.blob.core.chinacloudapi.cn") // 添加允许的源 .AllowAnyMethod() // 允许任何请求方法
  120. // .AllowAnyHeader() // 允许任何请求标头
  121. // .AllowCredentials(); // 允许包含凭据
  122. #endif
  123. });
  124. });
  125. builder.Services.AddHangfire(config => {
  126. config.UseRedisStorage(builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString"), new RedisStorageOptions { Db=1 });
  127. });
  128. builder.Services.AddHangfireServer();
  129. var app = builder.Build();
  130. if (app.Environment.IsDevelopment())
  131. {
  132. //app.UseSwagger();
  133. //app.UseSwaggerUI();
  134. }
  135. app.UseRouting();
  136. app.UseCors("MyAllowSpecificOrigins"); //使用跨域設定
  137. app.UseHttpsRedirection(); //開發中暫時關掉
  138. app.UseAuthentication();
  139. app.UseAuthorization();
  140. app.MapControllers();
  141. app.UseHangfireDashboard("/cdhabook-hangfire", new DashboardOptions
  142. {
  143. Authorization = new[] { new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
  144. {
  145. RequireSsl = false,
  146. SslRedirect = false,
  147. LoginCaseSensitive = true,
  148. Users = new []
  149. {
  150. new BasicAuthAuthorizationUser
  151. {
  152. Login = "cdhabook",
  153. PasswordClear = "cdhabook_abc123"
  154. }
  155. }
  156. }) }
  157. });
  158. RecurringJob.AddOrUpdate<VisitSettleJob>("1.访问日志记录统计VisitSettleJob,每小时的第2分钟,统计上个小时的", job => job.Run(), Cron.Hourly(2), options: new RecurringJobOptions { TimeZone=TimeZoneInfo.Local });
  159. app.Run();
  160. }
  161. }
  162. }