BaseServiceHostModule.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System.Linq;
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.DataProtection;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using StackExchange.Redis;
  6. using Microsoft.OpenApi.Models;
  7. using Volo.Abp;
  8. using Volo.Abp.Auditing;
  9. using Volo.Abp.Autofac;
  10. using Volo.Abp.EntityFrameworkCore;
  11. using Volo.Abp.Identity;
  12. using Volo.Abp.Localization;
  13. using Volo.Abp.Modularity;
  14. using Volo.Abp.AspNetCore.MultiTenancy;
  15. using System;
  16. using Volo.Abp.TenantManagement;
  17. using Volo.Abp.Threading;
  18. using Volo.Abp.Data;
  19. using Volo.Abp.AspNetCore.Serilog;
  20. using Volo.Abp.PermissionManagement.HttpApi;
  21. using Microsoft.AspNetCore.Cors;
  22. using Volo.Abp.MultiTenancy;
  23. using BaseService.EntityFrameworkCore;
  24. using Business;
  25. using System.Collections.Generic;
  26. using Microsoft.AspNetCore.Authentication.JwtBearer;
  27. using Volo.Abp.Security.Claims;
  28. using System.Security.Claims;
  29. namespace BaseService
  30. {
  31. [DependsOn(
  32. typeof(AbpAutofacModule),
  33. typeof(BaseServiceApplicationModule),
  34. typeof(BaseServiceEntityFrameworkCoreModule),
  35. typeof(BaseServiceHttpApiModule),
  36. typeof(AbpAspNetCoreMultiTenancyModule),
  37. typeof(AbpAspNetCoreSerilogModule)
  38. )]
  39. public class BaseServiceHostModule : AbpModule
  40. {
  41. private const string DefaultCorsPolicyName = "Default";
  42. public override void ConfigureServices(ServiceConfigurationContext context)
  43. {
  44. var configuration = context.Services.GetConfiguration();
  45. Configure<AbpMultiTenancyOptions>(options =>
  46. {
  47. options.IsEnabled = true;
  48. });
  49. context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  50. .AddJwtBearer(options =>
  51. {
  52. options.Authority = configuration["AuthServer:Authority"];
  53. options.RequireHttpsMetadata = false;
  54. options.Audience = "BaseService";
  55. });
  56. context.Services.AddSwaggerGen(options =>
  57. {
  58. options.SwaggerDoc("v1", new OpenApiInfo { Title = "BaseService Service API", Version = "v1" });
  59. options.DocInclusionPredicate((docName, description) => true);
  60. options.CustomSchemaIds(type => type.FullName);
  61. options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
  62. {
  63. Description = "请输入JWT令牌,例如:Bearer 12345abcdef",
  64. Name = "Authorization",
  65. In = ParameterLocation.Header,
  66. Type = SecuritySchemeType.ApiKey,
  67. Scheme = "Bearer"
  68. });
  69. options.AddSecurityRequirement(new OpenApiSecurityRequirement()
  70. {
  71. {
  72. new OpenApiSecurityScheme
  73. {
  74. Reference = new OpenApiReference
  75. {
  76. Type = ReferenceType.SecurityScheme,
  77. Id = "Bearer"
  78. },
  79. Scheme = "oauth2",
  80. Name = "Bearer",
  81. In = ParameterLocation.Header,
  82. },
  83. new List<string>()
  84. }
  85. });
  86. });
  87. Configure<AbpDbContextOptions>(options =>
  88. {
  89. options.UseMySQL();
  90. });
  91. //context.Services.AddStackExchangeRedisCache(options =>
  92. //{
  93. // options.Configuration = configuration["Redis:Configuration"];
  94. //});
  95. Configure<AbpAuditingOptions>(options =>
  96. {
  97. options.IsEnabledForGetRequests = true;
  98. options.ApplicationName = "BaseService";
  99. });
  100. context.Services.AddCors(options =>
  101. {
  102. options.AddPolicy(DefaultCorsPolicyName, builder =>
  103. {
  104. builder
  105. .WithOrigins(
  106. configuration["App:CorsOrigins"]
  107. .Split(",", StringSplitOptions.RemoveEmptyEntries)
  108. .Select(o => o.RemovePostFix("/"))
  109. .ToArray()
  110. )
  111. .WithAbpExposedHeaders()
  112. .SetIsOriginAllowedToAllowWildcardSubdomains()
  113. .AllowAnyHeader()
  114. .AllowAnyMethod()
  115. .AllowCredentials();
  116. });
  117. });
  118. //var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
  119. //context.Services.AddDataProtection()
  120. // .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
  121. Configure<AbpLocalizationOptions>(options =>
  122. {
  123. options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
  124. options.Languages.Add(new LanguageInfo("en", "en", "English"));
  125. options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
  126. options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
  127. options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
  128. options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
  129. options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
  130. });
  131. }
  132. public override void OnApplicationInitialization(ApplicationInitializationContext context)
  133. {
  134. var app = context.GetApplicationBuilder();
  135. app.UseCorrelationId();
  136. app.UseStaticFiles();
  137. app.UseRouting();
  138. app.UseCors(DefaultCorsPolicyName);
  139. app.UseAuthentication();
  140. app.UseMultiTenancy();
  141. app.Use(async (ctx, next) =>
  142. {
  143. var currentPrincipalAccessor = ctx.RequestServices.GetRequiredService<ICurrentPrincipalAccessor>();
  144. var map = new Dictionary<string, string>()
  145. {
  146. { "sub", AbpClaimTypes.UserId },
  147. { "role", AbpClaimTypes.Role },
  148. { "email", AbpClaimTypes.Email },
  149. { "name", AbpClaimTypes.UserName },
  150. };
  151. var mapClaims = currentPrincipalAccessor.Principal.Claims.Where(p => map.Keys.Contains(p.Type)).ToList();
  152. currentPrincipalAccessor.Principal.AddIdentity(new ClaimsIdentity(mapClaims.Select(p => new Claim(map[p.Type], p.Value, p.ValueType, p.Issuer))));
  153. await next();
  154. });
  155. app.UseAbpRequestLocalization();
  156. app.UseSwagger();
  157. app.UseSwaggerUI(options =>
  158. {
  159. options.SwaggerEndpoint("/swagger/v1/swagger.json", "BaseService Service API");
  160. });
  161. app.UseAuditing();
  162. app.UseAbpSerilogEnrichers();
  163. app.UseUnitOfWork();
  164. app.UseConfiguredEndpoints();
  165. AsyncHelper.RunSync(async () =>
  166. {
  167. using (var scope = context.ServiceProvider.CreateScope())
  168. {
  169. await scope.ServiceProvider
  170. .GetRequiredService<IDataSeeder>()
  171. .SeedAsync();
  172. }
  173. });
  174. }
  175. }
  176. }