BaseServiceHostModule.cs 7.2 KB

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