Files
Yi.Admin/Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs

256 lines
9.3 KiB
C#
Raw Normal View History

2023-12-11 09:55:12 +08:00
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Cors;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Converters;
2023-12-11 09:55:12 +08:00
using Volo.Abp;
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
2024-01-21 00:26:21 +08:00
using Volo.Abp.AspNetCore.MultiTenancy;
2023-12-11 09:55:12 +08:00
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.AntiForgery;
using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Auditing;
using Volo.Abp.Autofac;
using Volo.Abp.Caching;
2023-12-11 09:55:12 +08:00
using Volo.Abp.Modularity;
2024-01-21 18:11:04 +08:00
using Volo.Abp.MultiTenancy;
2023-12-11 09:55:12 +08:00
using Volo.Abp.Swashbuckle;
using Yi.Abp.Application;
using Yi.Abp.SqlsugarCore;
using Yi.Framework.AspNetCore;
using Yi.Framework.AspNetCore.Authentication.OAuth;
using Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
using Yi.Framework.AspNetCore.Authentication.OAuth.QQ;
2023-12-11 09:55:12 +08:00
using Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder;
using Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection;
2023-12-11 21:14:12 +08:00
using Yi.Framework.Bbs.Application;
2023-12-11 09:55:12 +08:00
using Yi.Framework.Rbac.Application;
using Yi.Framework.Rbac.Domain.Authorization;
2024-01-24 11:26:44 +08:00
using Yi.Framework.Rbac.Domain.Shared.Consts;
2023-12-11 09:55:12 +08:00
using Yi.Framework.Rbac.Domain.Shared.Options;
2024-02-06 15:25:17 +08:00
using Yi.Framework.TenantManagement.Application;
2023-12-11 09:55:12 +08:00
namespace Yi.Abp.Web
{
[DependsOn(
2023-12-12 17:56:11 +08:00
typeof(YiAbpSqlSugarCoreModule),
2023-12-11 09:55:12 +08:00
typeof(YiAbpApplicationModule),
2024-01-21 00:26:21 +08:00
typeof(AbpAspNetCoreMultiTenancyModule),
2023-12-11 09:55:12 +08:00
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAutofacModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpAuditingModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(YiFrameworkAspNetCoreModule),
typeof(YiFrameworkAspNetCoreAuthenticationOAuthModule)
2023-12-11 09:55:12 +08:00
)]
public class YiAbpWebModule : AbpModule
{
private const string DefaultCorsPolicyName = "Default";
public override Task ConfigureServicesAsync(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
2023-12-12 17:16:28 +08:00
var host = context.Services.GetHostingEnvironment();
2023-12-11 09:55:12 +08:00
var service = context.Services;
2023-12-11 21:14:12 +08:00
2023-12-11 09:55:12 +08:00
//请求日志
Configure<AbpAuditingOptions>(optios =>
{
2024-01-23 15:08:01 +08:00
//默认关闭,开启会有大量的审计日志
optios.IsEnabled = false;
//审计日志过滤器
2023-12-11 09:55:12 +08:00
optios.AlwaysLogSelectors.Add(x => Task.FromResult(true));
});
//动态Api
Configure<AbpAspNetCoreMvcOptions>(options =>
{
2023-12-11 22:14:13 +08:00
options.ConventionalControllers.Create(typeof(YiAbpApplicationModule).Assembly, options => options.RemoteServiceName = "default");
2023-12-11 18:43:36 +08:00
options.ConventionalControllers.Create(typeof(YiFrameworkRbacApplicationModule).Assembly, options => options.RemoteServiceName = "rbac");
2023-12-11 21:14:12 +08:00
options.ConventionalControllers.Create(typeof(YiFrameworkBbsApplicationModule).Assembly, options => options.RemoteServiceName = "bbs");
2024-02-06 15:25:17 +08:00
options.ConventionalControllers.Create(typeof(YiFrameworkTenantManagementApplicationModule).Assembly, options => options.RemoteServiceName = "tenant-management");
2023-12-11 09:55:12 +08:00
});
//设置api格式
service.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
2024-01-05 23:05:13 +08:00
options.SerializerSettings.Converters.Add(new StringEnumConverter());
2023-12-11 09:55:12 +08:00
});
2023-12-12 14:33:32 +08:00
//设置缓存不要过期默认滑动20分钟
Configure<AbpDistributedCacheOptions>(cacheOptions =>
{
cacheOptions.GlobalCacheEntryOptions.SlidingExpiration =null;
});
2023-12-11 09:55:12 +08:00
Configure<AbpAntiForgeryOptions>(options =>
{
options.AutoValidate = false;
});
//Swagger
2023-12-11 22:14:13 +08:00
context.Services.AddYiSwaggerGen<YiAbpWebModule>(options =>
{
2023-12-12 17:16:28 +08:00
options.SwaggerDoc("default", new OpenApiInfo { Title = "Yi.Framework.Abp", Version = "v1", Description = "集大成者" });
2023-12-11 22:14:13 +08:00
});
2023-12-11 09:55:12 +08:00
//跨域
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();
});
});
2024-01-21 18:11:04 +08:00
//配置多租户
Configure<AbpTenantResolveOptions>(options =>
{
//基于cookie jwt不好用有坑
options.TenantResolvers.RemoveAll(x => x.Name == CookieTenantResolveContributor.ContributorName);
});
2024-01-21 00:26:21 +08:00
2023-12-11 09:55:12 +08:00
//jwt鉴权
2023-12-16 14:10:11 +08:00
var jwtOptions = configuration.GetSection(nameof(JwtOptions)).Get<JwtOptions>();
var refreshJwtOptions = configuration.GetSection(nameof(RefreshJwtOptions)).Get<RefreshJwtOptions>();
2023-12-11 09:55:12 +08:00
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
2024-01-05 23:05:13 +08:00
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
2023-12-11 09:55:12 +08:00
{
2024-01-05 23:05:13 +08:00
ClockSkew = TimeSpan.Zero,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtOptions.Issuer,
ValidAudience = jwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SecurityKey))
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
2023-12-11 09:55:12 +08:00
{
2024-01-05 23:05:13 +08:00
var accessToken = context.Request.Query["access_token"];
if (!string.IsNullOrEmpty(accessToken))
2023-12-11 09:55:12 +08:00
{
2024-01-05 23:05:13 +08:00
context.Token = accessToken;
2023-12-11 09:55:12 +08:00
}
2024-01-05 23:05:13 +08:00
return Task.CompletedTask;
}
};
})
.AddJwtBearer(TokenTypeConst.Refresh, options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ClockSkew = TimeSpan.Zero,
ValidateIssuerSigningKey = true,
ValidIssuer = refreshJwtOptions.Issuer,
ValidAudience = refreshJwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(refreshJwtOptions.SecurityKey))
};
2024-01-24 11:26:44 +08:00
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var refresh_token = context.Request.Headers["refresh_token"];
if (!string.IsNullOrEmpty(refresh_token))
2024-01-24 11:26:44 +08:00
{
context.Token = refresh_token;
return Task.CompletedTask;
2024-01-24 11:26:44 +08:00
}
var refreshToken = context.Request.Query["refresh_token"];
if (!string.IsNullOrEmpty(refreshToken))
{
context.Token = refreshToken;
}
2024-01-24 11:26:44 +08:00
return Task.CompletedTask;
}
};
})
.AddQQ(options =>
{
configuration.GetSection("OAuth:QQ").Bind(options);
})
.AddGitee(options =>
{
configuration.GetSection("OAuth:Gitee").Bind(options);
2024-01-21 00:26:21 +08:00
});
2023-12-11 09:55:12 +08:00
//授权
context.Services.AddAuthorization();
return Task.CompletedTask;
}
2023-12-11 09:55:12 +08:00
public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
var service = context.ServiceProvider;
var env = context.GetEnvironment();
var app = context.GetApplicationBuilder();
app.UseRouting();
2023-12-11 22:14:13 +08:00
2023-12-11 21:14:12 +08:00
//跨域
2023-12-11 09:55:12 +08:00
app.UseCors(DefaultCorsPolicyName);
2023-12-11 22:14:13 +08:00
//无感token先刷新再鉴权
app.UseRefreshToken();
2023-12-11 21:14:12 +08:00
//鉴权
2023-12-11 09:55:12 +08:00
app.UseAuthentication();
2024-01-21 00:26:21 +08:00
//多租户
app.UseMultiTenancy();
2023-12-11 21:14:12 +08:00
//swagger
2023-12-11 09:55:12 +08:00
app.UseYiSwagger();
2024-01-05 23:05:13 +08:00
2024-01-02 23:26:05 +08:00
//请求处理
app.UseYiApiHandlinge();
2023-12-28 20:24:49 +08:00
//静态资源
app.UseStaticFiles("/api/app/wwwroot");
app.UseDefaultFiles();
app.UseDirectoryBrowser("/api/app/wwwroot");
2023-12-11 21:14:12 +08:00
//工作单元
2023-12-11 09:55:12 +08:00
app.UseUnitOfWork();
2023-12-11 21:14:12 +08:00
//授权
2023-12-11 09:55:12 +08:00
app.UseAuthorization();
2023-12-11 21:14:12 +08:00
//审计日志
2023-12-11 09:55:12 +08:00
app.UseAuditing();
2023-12-11 21:14:12 +08:00
//日志记录
2023-12-11 09:55:12 +08:00
app.UseAbpSerilogEnrichers();
2023-12-11 21:14:12 +08:00
//终节点
2023-12-11 09:55:12 +08:00
app.UseConfiguredEndpoints();
return Task.CompletedTask;
}
}
}