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.
228 lines
8.7 KiB
228 lines
8.7 KiB
1 year ago
|
using System.Linq;
|
||
|
using Microsoft.AspNetCore.Builder;
|
||
|
using Microsoft.Extensions.DependencyInjection;
|
||
|
using Microsoft.OpenApi.Models;
|
||
|
using Volo.Abp;
|
||
|
using Volo.Abp.Auditing;
|
||
|
using Volo.Abp.Autofac;
|
||
|
using Volo.Abp.EntityFrameworkCore;
|
||
|
using Volo.Abp.Localization;
|
||
|
using Volo.Abp.Modularity;
|
||
|
using Volo.Abp.AspNetCore.MultiTenancy;
|
||
|
using System;
|
||
|
using Volo.Abp.Threading;
|
||
|
using Volo.Abp.Data;
|
||
|
using Volo.Abp.AspNetCore.Serilog;
|
||
|
using Microsoft.AspNetCore.Cors;
|
||
|
using Volo.Abp.MultiTenancy;
|
||
|
using BaseService.EntityFrameworkCore;
|
||
|
using System.Collections.Generic;
|
||
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||
|
using Volo.Abp.Security.Claims;
|
||
|
using System.Security.Claims;
|
||
|
using Volo.Abp.PermissionManagement;
|
||
|
using Volo.Abp.FeatureManagement;
|
||
|
using Microsoft.AspNetCore.Identity;
|
||
|
using BaseService.BaseData;
|
||
|
using Volo.Abp.AspNetCore.Mvc.AntiForgery;
|
||
|
|
||
|
namespace BaseService
|
||
|
{
|
||
|
[DependsOn(
|
||
|
typeof(AbpAutofacModule),
|
||
|
typeof(BaseServiceApplicationModule),
|
||
|
typeof(BaseServiceEntityFrameworkCoreModule),
|
||
|
typeof(BaseServiceHttpApiModule),
|
||
|
typeof(AbpAspNetCoreMultiTenancyModule),
|
||
|
typeof(AbpAspNetCoreSerilogModule)
|
||
|
)]
|
||
|
public class BaseServiceHostModule : AbpModule
|
||
|
{
|
||
|
private const string DefaultCorsPolicyName = "Default";
|
||
|
|
||
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||
|
{
|
||
|
var configuration = context.Services.GetConfiguration();
|
||
|
|
||
|
Configure<AbpMultiTenancyOptions>(options =>
|
||
|
{
|
||
|
options.IsEnabled = true;
|
||
|
});
|
||
|
|
||
|
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
||
|
.AddJwtBearer(options =>
|
||
|
{
|
||
|
options.Authority = configuration["AuthServer:Authority"];
|
||
|
options.RequireHttpsMetadata = false;
|
||
|
options.Audience = "BaseService";
|
||
|
});
|
||
|
|
||
|
context.Services.AddSwaggerGen(options =>
|
||
|
{
|
||
|
options.SwaggerDoc("v1", new OpenApiInfo { Title = "BaseService Service API", Version = "v1" });
|
||
|
options.DocInclusionPredicate((docName, description) => true);
|
||
|
options.CustomSchemaIds(type => type.FullName);
|
||
|
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
||
|
{
|
||
|
Description = "请输入JWT令牌,例如:Bearer 12345abcdef",
|
||
|
Name = "Authorization",
|
||
|
In = ParameterLocation.Header,
|
||
|
Type = SecuritySchemeType.ApiKey,
|
||
|
Scheme = "Bearer"
|
||
|
});
|
||
|
|
||
|
options.AddSecurityRequirement(new OpenApiSecurityRequirement()
|
||
|
{
|
||
|
{
|
||
|
new OpenApiSecurityScheme
|
||
|
{
|
||
|
Reference = new OpenApiReference
|
||
|
{
|
||
|
Type = ReferenceType.SecurityScheme,
|
||
|
Id = "Bearer"
|
||
|
},
|
||
|
Scheme = "oauth2",
|
||
|
Name = "Bearer",
|
||
|
In = ParameterLocation.Header,
|
||
|
|
||
|
},
|
||
|
new List<string>()
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
Configure<AbpDbContextOptions>(options =>
|
||
|
{
|
||
|
options.UseSqlServer();
|
||
|
});
|
||
|
//去防伪
|
||
|
context.Services.Configure<AbpAntiForgeryOptions>(options =>
|
||
|
{
|
||
|
options.AutoValidate = false;
|
||
|
});
|
||
|
//context.Services.AddStackExchangeRedisCache(options =>
|
||
|
//{
|
||
|
// options.Configuration = configuration["Redis:Configuration"];
|
||
|
//});
|
||
|
|
||
|
Configure<AbpAuditingOptions>(options =>
|
||
|
{
|
||
|
options.IsEnabledForGetRequests = true;
|
||
|
options.ApplicationName = "BaseService";
|
||
|
});
|
||
|
|
||
|
context.Services.AddCors(options =>
|
||
|
{
|
||
|
options.AddPolicy(DefaultCorsPolicyName, builder =>
|
||
|
{
|
||
|
builder
|
||
|
.WithOrigins(
|
||
|
configuration["App:CorsOrigins"]
|
||
|
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
||
|
.Select(o => o.RemovePostFix("/"))
|
||
|
.ToArray()
|
||
|
)
|
||
|
.WithAbpExposedHeaders()
|
||
|
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
||
|
.AllowAnyHeader()
|
||
|
.AllowAnyMethod()
|
||
|
.AllowCredentials();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
//var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
|
||
|
//context.Services.AddDataProtection()
|
||
|
// .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
|
||
|
|
||
|
Configure<AbpLocalizationOptions>(options =>
|
||
|
{
|
||
|
//options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
|
||
|
options.Languages.Add(new LanguageInfo("en", "en", "English"));
|
||
|
//options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
|
||
|
//options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
|
||
|
//options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
|
||
|
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
|
||
|
|
||
|
});
|
||
|
|
||
|
Configure<PermissionManagementOptions>(options =>
|
||
|
{
|
||
|
options.IsDynamicPermissionStoreEnabled = true;
|
||
|
});
|
||
|
|
||
|
//重置密码功能
|
||
|
ConfigurePasswordSet(context);
|
||
|
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 设置密码强度
|
||
|
/// </summary>
|
||
|
/// <param name="context"></param>
|
||
|
private void ConfigurePasswordSet(ServiceConfigurationContext context)
|
||
|
{
|
||
|
context.Services.Configure<IdentityOptions>(options =>
|
||
|
{
|
||
|
options.User.RequireUniqueEmail = true;
|
||
|
//options.Lockout.AllowedForNewUsers = true;
|
||
|
//options.Lockout.MaxFailedAccessAttempts = 2;
|
||
|
|
||
|
options.Password.RequireDigit = false;
|
||
|
options.Password.RequireLowercase = false;
|
||
|
options.Password.RequireNonAlphanumeric = false;
|
||
|
options.Password.RequireUppercase = false;
|
||
|
options.Password.RequiredLength = 6;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||
|
{
|
||
|
var app = context.GetApplicationBuilder();
|
||
|
|
||
|
app.UseCorrelationId();
|
||
|
app.UseStaticFiles();
|
||
|
app.UseRouting();
|
||
|
app.UseCors(DefaultCorsPolicyName);
|
||
|
app.UseAuthentication();
|
||
|
app.UseMultiTenancy();
|
||
|
|
||
|
app.Use(async (ctx, next) =>
|
||
|
{
|
||
|
var currentPrincipalAccessor = ctx.RequestServices.GetRequiredService<ICurrentPrincipalAccessor>();
|
||
|
var map = new Dictionary<string, string>()
|
||
|
{
|
||
|
{ "sub", AbpClaimTypes.UserId },
|
||
|
{ "role", AbpClaimTypes.Role },
|
||
|
{ "email", AbpClaimTypes.Email },
|
||
|
{ "name", AbpClaimTypes.UserName },
|
||
|
};
|
||
|
var mapClaims = currentPrincipalAccessor.Principal.Claims.Where(p => map.Keys.Contains(p.Type)).ToList();
|
||
|
currentPrincipalAccessor.Principal.AddIdentity(new ClaimsIdentity(mapClaims.Select(p => new Claim(map[p.Type], p.Value, p.ValueType, p.Issuer))));
|
||
|
await next();
|
||
|
});
|
||
|
|
||
|
app.UseAbpRequestLocalization();
|
||
|
app.UseSwagger();
|
||
|
app.UseSwaggerUI(options =>
|
||
|
{
|
||
|
options.SwaggerEndpoint("/swagger/v1/swagger.json", "BaseService Service API");
|
||
|
});
|
||
|
|
||
|
app.UseAuditing();
|
||
|
app.UseAbpSerilogEnrichers();
|
||
|
app.UseUnitOfWork();
|
||
|
app.UseConfiguredEndpoints();
|
||
|
|
||
|
AsyncHelper.RunSync(async () =>
|
||
|
{
|
||
|
using (var scope = context.ServiceProvider.CreateScope())
|
||
|
{
|
||
|
await scope.ServiceProvider
|
||
|
.GetRequiredService<IDataSeeder>()
|
||
|
.SeedAsync();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|