ABP vNext + OpenIddict:多租户授权中心 🚀
TL;DR 🎯
- ✅ 多租户隔离:EF Core “影子属性” + 全局查询过滤 + SaveChanges 钩子,保障所有 OpenIddict 实体按当前租户过滤
- 🔑 OpenIddict 集成:
AbpOpenIddictModule一行启用 Core/Server/Validation,并整合 ASP.NET Identity - 🔒 安全加固:Azure Key Vault 签名证书、严格 CORS/CSP/HSTS、生产环境证书示例
- 🚀 高性能可复现:Redis 分布式缓存、刷新令牌滚动策略、后台 Token 清理 Hosted Service
- ✅ 测试 & CI/CD:集成测试覆盖租户隔离与授权流程,GitHub Actions 自动化 Migrations → 测试 → 部署
1. 环境与依赖 🛠️
-
目标框架:.NET 8.0 +
-
ABP 版本:8.x +
-
核心 NuGet 包
dotnet add package Volo.Abp.OpenIddict --version 8.* dotnet add package Volo.Abp.OpenIddict.EntityFrameworkCore --version 8.* dotnet add package Volo.Abp.TenantManagement.Domain --version 8.* dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.Identity.Web dotnet add package StackExchange.Redis dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets -
数据库:EF Core + SQL Server / PostgreSQL
-
缓存:Redis
-
示例 ConnectionString
"ConnectionStrings": { "Default": "Server=.;Database=AuthCenter;User Id=sa;Password=YourPwd;Max Pool Size=200;Command Timeout=60;" }, "Redis": "localhost:6379"
2. 系统架构概览 🏗️
- Tenant Resolver:Host/Path/Header 多策略解析,注入
TenantId - Configuration Store:Clients、Scopes 存于 EF Core 表,结合“影子属性”按租户过滤
- Redis 缓存:授权配置缓存、验证密钥缓存、Token 缓存
3. 模块依赖配置 🔧
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.OpenIddict;
using Volo.Abp.OpenIddict.EntityFrameworkCore;
using Volo.Abp.TenantManagement.Domain;
namespace AuthCenter
{
[DependsOn(
typeof(AbpOpenIddictModule),
typeof(AbpOpenIddictEntityFrameworkCoreModule),
typeof(AbpTenantManagementDomainModule)
)]
public class AuthCenterModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 配置全局 EF Core 提供者(SQL Server)
Configure<AbpDbContextOptions>(opts =>
{
opts.UseSqlServer();
});
}
}
}
4. Program.cs 配置 ⚙️
var builder = WebApplication.CreateBuilder(args);
// 1. Key Vault 集成(可选)🔐
var vaultUrl = builder.Configuration["KeyVault:Url"];
if (!string.IsNullOrEmpty(vaultUrl))
{
builder.Configuration
.AddAzureKeyVault(new Uri(vaultUrl), new DefaultAzureCredential());
}
// 2. CORS 策略 🛡️
builder.Services.AddCors(opts =>
{
opts.AddPolicy("AllowTenantApps", p =>
p.WithOrigins("https://*.yourtenantdomain.com")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials());
});
// 3. EF Core + OpenIddict 实体 注册 🗄️
var connString = builder.Configuration.GetConnectionString("Default");
builder.Services.AddDbContext<CustomOpenIddictDbContext>(options =>
{
options.UseSqlServer(connString,
sql => sql.MigrationsAssembly(typeof(AuthCenterModule).Assembly.FullName));
options.UseOpenIddict(); // 确保 OpenIddict 实体映射
});
builder.Services.AddAbpDbContext<CustomOpenIddictDbContext>(opts =>
{
opts.AddDefaultRepositories<OpenIddictEntityFrameworkCoreApplication>()

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



