AuthServerModule.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. using System;
  2. using System.Linq;
  3. using Medallion.Threading;
  4. using Medallion.Threading.Redis;
  5. using Microsoft.AspNetCore.Builder;
  6. using Microsoft.AspNetCore.Cors;
  7. using Microsoft.AspNetCore.DataProtection;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.Extensions.Hosting;
  10. using StackExchange.Redis;
  11. using Volo.Abp;
  12. using Volo.Abp.Account;
  13. using Volo.Abp.Account.Web;
  14. using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
  15. using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite;
  16. using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;
  17. using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
  18. using Volo.Abp.AspNetCore.Serilog;
  19. using Volo.Abp.Auditing;
  20. using Volo.Abp.Autofac;
  21. using Volo.Abp.BackgroundJobs;
  22. using Volo.Abp.Caching;
  23. using Volo.Abp.Caching.StackExchangeRedis;
  24. using Volo.Abp.DistributedLocking;
  25. using Volo.Abp.Localization;
  26. using Volo.Abp.Modularity;
  27. using Volo.Abp.UI.Navigation.Urls;
  28. using Volo.Abp.VirtualFileSystem;
  29. using Volo.Abp.PermissionManagement.EntityFrameworkCore;
  30. using Volo.Abp.TenantManagement.EntityFrameworkCore;
  31. using Volo.Abp.Identity.EntityFrameworkCore;
  32. using Volo.Abp.AuditLogging.EntityFrameworkCore;
  33. using Volo.Abp.EntityFrameworkCore;
  34. using Volo.Abp.OpenIddict.EntityFrameworkCore;
  35. using Volo.Abp.Threading;
  36. using Volo.Abp.Data;
  37. namespace AuthServer;
  38. [DependsOn(
  39. typeof(AbpAutofacModule),
  40. typeof(AbpCachingStackExchangeRedisModule),
  41. typeof(AbpDistributedLockingModule),
  42. typeof(AbpAccountWebOpenIddictModule),
  43. typeof(AbpAccountApplicationModule),
  44. typeof(AbpAccountHttpApiModule),
  45. typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),
  46. typeof(AbpOpenIddictEntityFrameworkCoreModule),
  47. typeof(AbpPermissionManagementEntityFrameworkCoreModule),
  48. typeof(AbpAuditLoggingEntityFrameworkCoreModule),
  49. typeof(AbpIdentityEntityFrameworkCoreModule),
  50. typeof(AbpTenantManagementEntityFrameworkCoreModule),
  51. typeof(AbpAspNetCoreSerilogModule)
  52. )]
  53. public class AuthServerModule : AbpModule
  54. {
  55. public override void PreConfigureServices(ServiceConfigurationContext context)
  56. {
  57. PreConfigure<OpenIddictBuilder>(builder =>
  58. {
  59. builder.AddValidation(options =>
  60. {
  61. options.AddAudiences("AuthServer");
  62. options.UseLocalServer();
  63. options.UseAspNetCore();
  64. });
  65. });
  66. }
  67. public override void ConfigureServices(ServiceConfigurationContext context)
  68. {
  69. var hostingEnvironment = context.Services.GetHostingEnvironment();
  70. var configuration = context.Services.GetConfiguration();
  71. context.Services.AddOpenIddict().AddServer(options =>
  72. {
  73. options.UseAspNetCore()
  74. .EnableAuthorizationEndpointPassthrough()
  75. .EnableTokenEndpointPassthrough()
  76. .DisableTransportSecurityRequirement();
  77. });
  78. Configure<AbpLocalizationOptions>(options =>
  79. {
  80. options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
  81. options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
  82. options.Languages.Add(new LanguageInfo("en", "en", "English"));
  83. options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
  84. options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
  85. options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
  86. options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
  87. options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
  88. options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
  89. options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
  90. options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
  91. options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
  92. options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
  93. options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
  94. options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
  95. options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
  96. options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
  97. options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de"));
  98. options.Languages.Add(new LanguageInfo("es", "es", "Español", "es"));
  99. options.Languages.Add(new LanguageInfo("el", "el", "Ελληνικά"));
  100. });
  101. Configure<AbpDbContextOptions>(options =>
  102. {
  103. options.UseMySQL();
  104. });
  105. Configure<AbpBundlingOptions>(options =>
  106. {
  107. options.StyleBundles.Configure(
  108. LeptonXLiteThemeBundles.Styles.Global,
  109. bundle =>
  110. {
  111. bundle.AddFiles("/global-styles.css");
  112. }
  113. );
  114. });
  115. Configure<AbpAuditingOptions>(options =>
  116. {
  117. //options.IsEnabledForGetRequests = true;
  118. options.ApplicationName = "AuthServer";
  119. });
  120. if (hostingEnvironment.IsDevelopment())
  121. {
  122. }
  123. Configure<AppUrlOptions>(options =>
  124. {
  125. options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(','));
  126. options.Applications["Web_App"].RootUrl = configuration["App:ClientUrl"];
  127. options.Applications["Web_App"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password";
  128. });
  129. Configure<AbpBackgroundJobOptions>(options =>
  130. {
  131. options.IsJobExecutionEnabled = false;
  132. });
  133. Configure<AbpDistributedCacheOptions>(options =>
  134. {
  135. options.KeyPrefix = "AuthServer:";
  136. });
  137. var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("AuthServer");
  138. if (!hostingEnvironment.IsDevelopment())
  139. {
  140. var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
  141. dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "AuthServer-Protection-Keys");
  142. }
  143. context.Services.AddSingleton<IDistributedLockProvider>(sp =>
  144. {
  145. var connection = ConnectionMultiplexer
  146. .Connect(configuration["Redis:Configuration"]);
  147. return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
  148. });
  149. context.Services.AddCors(options =>
  150. {
  151. options.AddDefaultPolicy(builder =>
  152. {
  153. builder
  154. .WithOrigins(
  155. configuration["App:CorsOrigins"]
  156. .Split(",", StringSplitOptions.RemoveEmptyEntries)
  157. .Select(o => o.RemovePostFix("/"))
  158. .ToArray()
  159. )
  160. .WithAbpExposedHeaders()
  161. .SetIsOriginAllowedToAllowWildcardSubdomains()
  162. .AllowAnyHeader()
  163. .AllowAnyMethod()
  164. .AllowCredentials();
  165. });
  166. });
  167. }
  168. public override void OnApplicationInitialization(ApplicationInitializationContext context)
  169. {
  170. var app = context.GetApplicationBuilder();
  171. var env = context.GetEnvironment();
  172. if (env.IsDevelopment())
  173. {
  174. app.UseDeveloperExceptionPage();
  175. }
  176. app.UseAbpRequestLocalization();
  177. if (!env.IsDevelopment())
  178. {
  179. app.UseErrorPage();
  180. }
  181. app.UseCorrelationId();
  182. app.UseStaticFiles();
  183. app.UseRouting();
  184. app.UseCors();
  185. app.UseAuthentication();
  186. app.UseAbpOpenIddictValidation();
  187. app.UseMultiTenancy();
  188. app.UseUnitOfWork();
  189. app.UseAuthorization();
  190. app.UseAuditing();
  191. app.UseAbpSerilogEnrichers();
  192. app.UseConfiguredEndpoints();
  193. AsyncHelper.RunSync(async () =>
  194. {
  195. using (var scope = context.ServiceProvider.CreateScope())
  196. {
  197. await scope.ServiceProvider
  198. .GetRequiredService<IDataSeeder>()
  199. .SeedAsync();
  200. }
  201. });
  202. }
  203. }