abp

Форк
0
378 строк · 13.5 Кб
1
using Microsoft.AspNetCore.Cors;
2
using Microsoft.AspNetCore.DataProtection;
3
using Microsoft.AspNetCore.Extensions.DependencyInjection;
4
using Microsoft.Extensions.DependencyInjection.Extensions;
5
using Microsoft.OpenApi.Models;
6
using MyCompanyName.MyProjectName.Data;
7
using MyCompanyName.MyProjectName.Localization;
8
using OpenIddict.Validation.AspNetCore;
9
using Volo.Abp;
10
using Volo.Abp.Account;
11
using Volo.Abp.Account.Web;
12
using Volo.Abp.AspNetCore.MultiTenancy;
13
using Volo.Abp.AspNetCore.Mvc;
14
using Volo.Abp.AspNetCore.Mvc.Localization;
15
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
16
using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite;
17
using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;
18
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
19
using Volo.Abp.AspNetCore.Serilog;
20
using Volo.Abp.AuditLogging.MongoDB;
21
using Volo.Abp.Autofac;
22
using Volo.Abp.AutoMapper;
23
using Volo.Abp.Emailing;
24
using Volo.Abp.FeatureManagement;
25
using Volo.Abp.FeatureManagement.MongoDB;
26
using Volo.Abp.Identity;
27
using Volo.Abp.Identity.MongoDB;
28
using Volo.Abp.Localization;
29
using Volo.Abp.Localization.ExceptionHandling;
30
using Volo.Abp.Modularity;
31
using Volo.Abp.MultiTenancy;
32
using Volo.Abp.OpenIddict.MongoDB;
33
using Volo.Abp.PermissionManagement;
34
using Volo.Abp.PermissionManagement.MongoDB;
35
using Volo.Abp.PermissionManagement.HttpApi;
36
using Volo.Abp.PermissionManagement.Identity;
37
using Volo.Abp.PermissionManagement.OpenIddict;
38
using Volo.Abp.SettingManagement;
39
using Volo.Abp.SettingManagement.MongoDB;
40
using Volo.Abp.Swashbuckle;
41
using Volo.Abp.TenantManagement;
42
using Volo.Abp.TenantManagement.MongoDB;
43
using Volo.Abp.OpenIddict;
44
using Volo.Abp.Security.Claims;
45
using Volo.Abp.UI.Navigation.Urls;
46
using Volo.Abp.Uow;
47
using Volo.Abp.Validation.Localization;
48
using Volo.Abp.VirtualFileSystem;
49

50
namespace MyCompanyName.MyProjectName;
51

52
[DependsOn(
53
    // ABP Framework packages
54
    typeof(AbpAspNetCoreMvcModule),
55
    typeof(AbpAspNetCoreMultiTenancyModule),
56
    typeof(AbpAutofacModule),
57
    typeof(AbpAutoMapperModule),
58
    typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),
59
    typeof(AbpSwashbuckleModule),
60
    typeof(AbpAspNetCoreSerilogModule),
61

62
    // Account module packages
63
    typeof(AbpAccountApplicationModule),
64
    typeof(AbpAccountHttpApiModule),
65
    typeof(AbpAccountWebOpenIddictModule),
66

67
    // Identity module packages
68
    typeof(AbpPermissionManagementDomainIdentityModule),
69
    typeof(AbpPermissionManagementDomainOpenIddictModule),
70
    typeof(AbpIdentityApplicationModule),
71
    typeof(AbpIdentityHttpApiModule),
72
    typeof(AbpIdentityMongoDbModule),
73
    typeof(AbpOpenIddictMongoDbModule),
74

75
    // Audit logging module packages
76
    typeof(AbpAuditLoggingMongoDbModule),
77

78
    // Permission Management module packages
79
    typeof(AbpPermissionManagementApplicationModule),
80
    typeof(AbpPermissionManagementHttpApiModule),
81
    typeof(AbpPermissionManagementMongoDbModule),
82

83
    // Tenant Management module packages
84
    typeof(AbpTenantManagementApplicationModule),
85
    typeof(AbpTenantManagementHttpApiModule),
86
    typeof(AbpTenantManagementMongoDbModule),
87

88
    // Feature Management module packages
89
    typeof(AbpFeatureManagementApplicationModule),
90
    typeof(AbpFeatureManagementMongoDbModule),
91
    typeof(AbpFeatureManagementHttpApiModule),
92

93
    // Setting Management module packages
94
    typeof(AbpSettingManagementApplicationModule),
95
    typeof(AbpSettingManagementMongoDbModule),
96
    typeof(AbpSettingManagementHttpApiModule)
97
)]
98
public class MyProjectNameModule : AbpModule
99
{
100
    /* Single point to enable/disable multi-tenancy */
101
    private const bool IsMultiTenant = true;
102

103
    public override void PreConfigureServices(ServiceConfigurationContext context)
104
    {
105
        var hostingEnvironment = context.Services.GetHostingEnvironment();
106
        var configuration = context.Services.GetConfiguration();
107

108
        context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
109
        {
110
            options.AddAssemblyResource(
111
                typeof(MyProjectNameResource)
112
            );
113
        });
114

115
        PreConfigure<OpenIddictBuilder>(builder =>
116
        {
117
            builder.AddValidation(options =>
118
            {
119
                options.AddAudiences("MyProjectName");
120
                options.UseLocalServer();
121
                options.UseAspNetCore();
122
            });
123
        });
124

125
        if (!hostingEnvironment.IsDevelopment())
126
        {
127
            PreConfigure<AbpOpenIddictAspNetCoreOptions>(options =>
128
            {
129
                options.AddDevelopmentEncryptionAndSigningCertificate = false;
130
            });
131

132
            PreConfigure<OpenIddictServerBuilder>(serverBuilder =>
133
            {
134
                serverBuilder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", "00000000-0000-0000-0000-000000000000");
135
            });
136
        }
137
        
138
        MyProjectNameGlobalFeatureConfigurator.Configure();
139
        MyProjectNameModuleExtensionConfigurator.Configure();
140
    }
141

142
    public override void ConfigureServices(ServiceConfigurationContext context)
143
    {
144
        var hostingEnvironment = context.Services.GetHostingEnvironment();
145
        var configuration = context.Services.GetConfiguration();
146

147
        if (hostingEnvironment.IsDevelopment())
148
        {
149
            context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
150
        }
151

152
        ConfigureAuthentication(context);
153
        ConfigureBundles();
154
        ConfigureMultiTenancy();
155
        ConfigureUrls(configuration);
156
        ConfigureAutoMapper(context);
157
        ConfigureSwagger(context.Services, configuration);
158
        ConfigureAutoApiControllers();
159
        ConfigureVirtualFiles(hostingEnvironment);
160
        ConfigureLocalization();
161
        ConfigureCors(context, configuration);
162
        ConfigureDataProtection(context);
163
        ConfigureMongoDB(context);
164
    }
165

166
    private void ConfigureAuthentication(ServiceConfigurationContext context)
167
    {
168
        context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme);
169
        context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
170
        {
171
            options.IsDynamicClaimsEnabled = true;
172
        });
173
    }
174

175
    private void ConfigureBundles()
176
    {
177
        Configure<AbpBundlingOptions>(options =>
178
        {
179
            options.StyleBundles.Configure(
180
                LeptonXLiteThemeBundles.Styles.Global,
181
                bundle => { bundle.AddFiles("/global-styles.css"); }
182
            );
183
        });
184
    }
185

186
    private void ConfigureMultiTenancy()
187
    {
188
        Configure<AbpMultiTenancyOptions>(options =>
189
        {
190
            options.IsEnabled = IsMultiTenant;
191
        });
192
    }
193

194
    private void ConfigureUrls(IConfiguration configuration)
195
    {
196
        Configure<AppUrlOptions>(options =>
197
        {
198
            options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
199
            options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty<string>());
200

201
            options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"];
202
            options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password";
203
        });
204
    }
205

206
    private void ConfigureLocalization()
207
    {
208
        Configure<AbpLocalizationOptions>(options =>
209
        {
210
            options.Resources
211
                .Add<MyProjectNameResource>("en")
212
                .AddBaseTypes(typeof(AbpValidationResource))
213
                .AddVirtualJson("/Localization/MyProjectName");
214

215
            options.DefaultResourceType = typeof(MyProjectNameResource);
216

217
            options.Languages.Add(new LanguageInfo("en", "en", "English"));
218
            options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
219
            options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
220
            options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
221
            options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
222
            options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
223
            options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
224
            options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
225
            options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi"));
226
            options.Languages.Add(new LanguageInfo("is", "is", "Icelandic"));
227
            options.Languages.Add(new LanguageInfo("it", "it", "Italiano"));
228
            options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
229
            options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
230
            options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
231
            options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
232
            options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
233
            options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
234
            options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
235
            options.Languages.Add(new LanguageInfo("es", "es", "Español"));
236
            options.Languages.Add(new LanguageInfo("el", "el", "Ελληνικά"));
237
        });
238

239
        Configure<AbpExceptionLocalizationOptions>(options =>
240
        {
241
            options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource));
242
        });
243
    }
244

245
    private void ConfigureVirtualFiles(IWebHostEnvironment hostingEnvironment)
246
    {
247
        Configure<AbpVirtualFileSystemOptions>(options =>
248
        {
249
            options.FileSets.AddEmbedded<MyProjectNameModule>();
250
            if (hostingEnvironment.IsDevelopment())
251
            {
252
                /* Using physical files in development, so we don't need to recompile on changes */
253
                options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameModule>(hostingEnvironment.ContentRootPath);
254
            }
255
        });
256
    }
257

258
    private void ConfigureAutoApiControllers()
259
    {
260
        Configure<AbpAspNetCoreMvcOptions>(options =>
261
        {
262
            options.ConventionalControllers.Create(typeof(MyProjectNameModule).Assembly);
263
        });
264
    }
265

266
    private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
267
    {
268
        services.AddAbpSwaggerGenWithOAuth(
269
            configuration["AuthServer:Authority"]!,
270
            new Dictionary<string, string>
271
            {
272
                    {"MyProjectName", "MyProjectName API"}
273
            },
274
            options =>
275
            {
276
                options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
277
                options.DocInclusionPredicate((docName, description) => true);
278
                options.CustomSchemaIds(type => type.FullName);
279
            });
280
    }
281

282
    private void ConfigureAutoMapper(ServiceConfigurationContext context)
283
    {
284
        context.Services.AddAutoMapperObjectMapper<MyProjectNameModule>();
285
        Configure<AbpAutoMapperOptions>(options =>
286
        {
287
            /* Uncomment `validate: true` if you want to enable the Configuration Validation feature.
288
             * See AutoMapper's documentation to learn what it is:
289
             * https://docs.automapper.org/en/stable/Configuration-validation.html
290
             */
291
            options.AddMaps<MyProjectNameModule>(/* validate: true */);
292
        });
293
    }
294

295
    private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
296
    {
297
        context.Services.AddCors(options =>
298
        {
299
            options.AddDefaultPolicy(builder =>
300
            {
301
                builder
302
                    .WithOrigins(
303
                        configuration["App:CorsOrigins"]?
304
                            .Split(",", StringSplitOptions.RemoveEmptyEntries)
305
                            .Select(o => o.RemovePostFix("/"))
306
                            .ToArray() ?? Array.Empty<string>()
307
                    )
308
                    .WithAbpExposedHeaders()
309
                    .SetIsOriginAllowedToAllowWildcardSubdomains()
310
                    .AllowAnyHeader()
311
                    .AllowAnyMethod()
312
                    .AllowCredentials();
313
            });
314
        });
315
    }
316

317
    private void ConfigureDataProtection(ServiceConfigurationContext context)
318
    {
319
        context.Services.AddDataProtection().SetApplicationName("MyProjectName");
320
    }
321

322
    private void ConfigureMongoDB(ServiceConfigurationContext context)
323
    {
324
        context.Services.AddMongoDbContext<MyProjectNameDbContext>(options =>
325
        {
326
            options.AddDefaultRepositories();
327
        });
328

329
        Configure<AbpUnitOfWorkDefaultOptions>(options =>
330
        {
331
            options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
332
        });
333
    }
334

335
    public override void OnApplicationInitialization(ApplicationInitializationContext context)
336
    {
337
        var app = context.GetApplicationBuilder();
338
        var env = context.GetEnvironment();
339

340
        if (env.IsDevelopment())
341
        {
342
            app.UseDeveloperExceptionPage();
343
        }
344

345
        app.UseAbpRequestLocalization();
346

347
        if (!env.IsDevelopment())
348
        {
349
            app.UseErrorPage();
350
        }
351

352
        app.UseCorrelationId();
353
        app.UseStaticFiles();
354
        app.UseRouting();
355
        app.UseCors();
356
        app.UseAuthentication();
357
        app.UseAbpOpenIddictValidation();
358

359
        if (IsMultiTenant)
360
        {
361
            app.UseMultiTenancy();
362
        }
363

364
        app.UseUnitOfWork();
365
        app.UseDynamicClaims();
366
        app.UseAuthorization();
367

368
        app.UseSwagger();
369
        app.UseAbpSwaggerUI(options =>
370
        {
371
            options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");
372
        });
373

374
        app.UseAuditing();
375
        app.UseAbpSerilogEnrichers();
376
        app.UseConfiguredEndpoints();
377
    }
378
}
379

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.