mirror of https://github.com/abpframework/abp
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							246 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							246 lines
						
					
					
						
							11 KiB
						
					
					
				using System;
 | 
						|
using Microsoft.AspNetCore.Builder;
 | 
						|
using Microsoft.AspNetCore.Hosting;
 | 
						|
using Microsoft.Extensions.DependencyInjection;
 | 
						|
using Swashbuckle.AspNetCore.Swagger;
 | 
						|
using System.IO;
 | 
						|
using Microsoft.AspNetCore.Authentication;
 | 
						|
using Microsoft.AspNetCore.DataProtection;
 | 
						|
using Microsoft.Extensions.Configuration;
 | 
						|
using Microsoft.Extensions.Hosting;
 | 
						|
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
 | 
						|
using MyCompanyName.MyProjectName.Localization;
 | 
						|
using MyCompanyName.MyProjectName.MultiTenancy;
 | 
						|
using MyCompanyName.MyProjectName.Web;
 | 
						|
using StackExchange.Redis;
 | 
						|
using Volo.Abp;
 | 
						|
using Volo.Abp.AspNetCore.Authentication.OAuth;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.Client;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.Localization;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.UI;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic;
 | 
						|
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
 | 
						|
using Volo.Abp.Autofac;
 | 
						|
using Volo.Abp.AutoMapper;
 | 
						|
using Volo.Abp.Caching;
 | 
						|
using Volo.Abp.Http.Client.IdentityModel;
 | 
						|
using Volo.Abp.Identity;
 | 
						|
using Volo.Abp.Identity.Web;
 | 
						|
using Volo.Abp.Modularity;
 | 
						|
using Volo.Abp.MultiTenancy;
 | 
						|
using Volo.Abp.PermissionManagement;
 | 
						|
using Volo.Abp.PermissionManagement.Web;
 | 
						|
using Volo.Abp.Security.Claims;
 | 
						|
using Volo.Abp.TenantManagement;
 | 
						|
using Volo.Abp.TenantManagement.Web;
 | 
						|
using Volo.Abp.UI.Navigation.Urls;
 | 
						|
using Volo.Abp.UI;
 | 
						|
using Volo.Abp.VirtualFileSystem;
 | 
						|
 | 
						|
namespace MyCompanyName.MyProjectName
 | 
						|
{
 | 
						|
    [DependsOn(
 | 
						|
        typeof(MyProjectNameWebModule),
 | 
						|
        typeof(MyProjectNameHttpApiClientModule),
 | 
						|
        typeof(AbpAspNetCoreAuthenticationOAuthModule),
 | 
						|
        typeof(AbpAspNetCoreMvcClientModule),
 | 
						|
        typeof(AbpAspNetCoreMvcUiBasicThemeModule),
 | 
						|
        typeof(AbpAutofacModule),
 | 
						|
        typeof(AbpHttpClientIdentityModelModule),
 | 
						|
        typeof(AbpIdentityWebModule),
 | 
						|
        typeof(AbpIdentityHttpApiClientModule),
 | 
						|
        typeof(AbpTenantManagementWebModule),
 | 
						|
        typeof(AbpTenantManagementHttpApiClientModule),
 | 
						|
        typeof(AbpPermissionManagementHttpApiClientModule)
 | 
						|
        )]
 | 
						|
    public class MyProjectNameWebHostModule : AbpModule
 | 
						|
    {
 | 
						|
        public override void PreConfigureServices(ServiceConfigurationContext context)
 | 
						|
        {
 | 
						|
            context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
 | 
						|
            {
 | 
						|
                options.AddAssemblyResource(
 | 
						|
                    typeof(MyProjectNameResource),
 | 
						|
                    typeof(MyProjectNameDomainSharedModule).Assembly,
 | 
						|
                    typeof(MyProjectNameApplicationContractsModule).Assembly,
 | 
						|
                    typeof(MyProjectNameWebHostModule).Assembly
 | 
						|
                );
 | 
						|
            });
 | 
						|
        }
 | 
						|
        
 | 
						|
        public override void ConfigureServices(ServiceConfigurationContext context)
 | 
						|
        {
 | 
						|
            var hostingEnvironment = context.Services.GetHostingEnvironment();
 | 
						|
            var configuration = context.Services.GetConfiguration();
 | 
						|
 | 
						|
            ConfigureCache(configuration);
 | 
						|
            ConfigureUrls(configuration);
 | 
						|
            ConfigureAuthentication(context, configuration);
 | 
						|
            ConfigureAutoMapper();
 | 
						|
            ConfigureVirtualFileSystem(hostingEnvironment);
 | 
						|
            ConfigureSwaggerServices(context.Services);
 | 
						|
            ConfigureMultiTenancy();
 | 
						|
            ConfigureRedis(context, configuration, hostingEnvironment);
 | 
						|
        }
 | 
						|
        
 | 
						|
        private void ConfigureCache(IConfigurationRoot configuration)
 | 
						|
        {
 | 
						|
            Configure<AbpCacheOptions>(options =>
 | 
						|
            {
 | 
						|
                options.KeyPrefix = "MyProjectName:";
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureUrls(IConfigurationRoot configuration)
 | 
						|
        {
 | 
						|
            Configure<AppUrlOptions>(options =>
 | 
						|
            {
 | 
						|
                options.Applications["MVC"].RootUrl = configuration["AppSelfUrl"];
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureMultiTenancy()
 | 
						|
        {
 | 
						|
            Configure<AbpMultiTenancyOptions>(options =>
 | 
						|
            {
 | 
						|
                options.IsEnabled = MultiTenancyConsts.IsEnabled;
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureAuthentication(ServiceConfigurationContext context, IConfigurationRoot configuration)
 | 
						|
        {
 | 
						|
            context.Services.AddAuthentication(options =>
 | 
						|
                {
 | 
						|
                    options.DefaultScheme = "Cookies";
 | 
						|
                    options.DefaultChallengeScheme = "oidc";
 | 
						|
                })
 | 
						|
                .AddCookie("Cookies", options =>
 | 
						|
                {
 | 
						|
                    options.ExpireTimeSpan = TimeSpan.FromDays(365);
 | 
						|
                })
 | 
						|
                .AddOpenIdConnect("oidc", options =>
 | 
						|
                {
 | 
						|
                    options.Authority = configuration["AuthServer:Authority"];
 | 
						|
                    options.RequireHttpsMetadata = false;
 | 
						|
                    options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
 | 
						|
 | 
						|
                    options.ClientId = configuration["AuthServer:ClientId"];
 | 
						|
                    options.ClientSecret = configuration["AuthServer:ClientSecret"];
 | 
						|
 | 
						|
                    options.SaveTokens = true;
 | 
						|
                    options.GetClaimsFromUserInfoEndpoint = true;
 | 
						|
 | 
						|
                    options.Scope.Add("role");
 | 
						|
                    options.Scope.Add("email");
 | 
						|
                    options.Scope.Add("phone");
 | 
						|
                    options.Scope.Add("MyProjectName");
 | 
						|
 | 
						|
                    options.ClaimActions.MapJsonKey(AbpClaimTypes.UserName, "name");
 | 
						|
                    options.ClaimActions.DeleteClaim("name");
 | 
						|
                });
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureAutoMapper()
 | 
						|
        {
 | 
						|
            Configure<AbpAutoMapperOptions>(options =>
 | 
						|
            {
 | 
						|
                options.AddMaps<MyProjectNameWebHostModule>();
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
 | 
						|
        {
 | 
						|
            if (hostingEnvironment.IsDevelopment())
 | 
						|
            {
 | 
						|
                Configure<VirtualFileSystemOptions>(options =>
 | 
						|
                {
 | 
						|
                    //<TEMPLATE-REMOVE>
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBootstrapModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Bootstrap", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiThemeSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBasicThemeModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpPermissionManagementWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}permission-management{0}src{0}Volo.Abp.PermissionManagement.Web", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<AbpIdentityWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}identity{0}src{0}Volo.Abp.Identity.Web", Path.DirectorySeparatorChar)));
 | 
						|
                    //</TEMPLATE-REMOVE>
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
 | 
						|
                    options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar)));
 | 
						|
                });
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureSwaggerServices(IServiceCollection services)
 | 
						|
        {
 | 
						|
            services.AddSwaggerGen(
 | 
						|
                options =>
 | 
						|
                {
 | 
						|
                    options.SwaggerDoc("v1", new Info { Title = "MyProjectName API", Version = "v1" });
 | 
						|
                    options.DocInclusionPredicate((docName, description) => true);
 | 
						|
                    options.CustomSchemaIds(type => type.FullName);
 | 
						|
                }
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        private void ConfigureRedis(
 | 
						|
            ServiceConfigurationContext context,
 | 
						|
            IConfigurationRoot configuration,
 | 
						|
            IWebHostEnvironment hostingEnvironment)
 | 
						|
        {
 | 
						|
            context.Services.AddStackExchangeRedisCache(options =>
 | 
						|
            {
 | 
						|
                options.Configuration = configuration["Redis:Configuration"];
 | 
						|
            });
 | 
						|
 | 
						|
            if (!hostingEnvironment.IsDevelopment())
 | 
						|
            {
 | 
						|
                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
 | 
						|
                context.Services
 | 
						|
                    .AddDataProtection()
 | 
						|
                    .PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
 | 
						|
        {
 | 
						|
            var app = context.GetApplicationBuilder();
 | 
						|
            var env = context.GetEnvironment();
 | 
						|
 | 
						|
            if (env.IsDevelopment())
 | 
						|
            {
 | 
						|
                app.UseDeveloperExceptionPage();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                app.UseErrorPage();
 | 
						|
                app.UseHsts();
 | 
						|
            }
 | 
						|
 | 
						|
            app.UseHttpsRedirection();
 | 
						|
            app.UseVirtualFiles();
 | 
						|
            app.UseRouting();
 | 
						|
            app.UseAuthentication();
 | 
						|
            app.UseAuthorization();
 | 
						|
 | 
						|
            if (MultiTenancyConsts.IsEnabled)
 | 
						|
            {
 | 
						|
                app.UseMultiTenancy();
 | 
						|
            }
 | 
						|
 | 
						|
            app.UseAbpRequestLocalization();
 | 
						|
 | 
						|
            //TODO: Enable when Swagger supports ASP.NET Core 3.x
 | 
						|
            //app.UseSwagger();
 | 
						|
            //app.UseSwaggerUI(options =>
 | 
						|
            //{
 | 
						|
            //    options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");
 | 
						|
            //});
 | 
						|
 | 
						|
            app.UseAuditing();
 | 
						|
 | 
						|
            app.UseMvcWithDefaultRouteAndArea();
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |