feat: harden SaaS authentication and authorization

This commit is contained in:
2026-07-28 12:15:51 +08:00
parent f22f329d33
commit 5d2248efee
123 changed files with 9090 additions and 2822 deletions

View File

@@ -19,6 +19,7 @@
阶段设计文档:
- [`docs/architecture/authentication-authorization-security.md`](docs/architecture/authentication-authorization-security.md)当前认证、RBAC、DataScope、MFA、Session 与 Host 安全策略)
- [`docs/migration/phase-1-repository-baseline.md`](docs/migration/phase-1-repository-baseline.md)
- [`docs/migration/phase-2-engineering-foundation.md`](docs/migration/phase-2-engineering-foundation.md)
- [`docs/migration/phase-3-tenant-isolation-and-shared-question-bank.md`](docs/migration/phase-3-tenant-isolation-and-shared-question-bank.md)
@@ -59,7 +60,7 @@ Tiku.IntegrationTests # API / EF 模型集成测试
- ASP.NET Authorization 负责权限策略。
- JWT + 数据库 `auth_sessions` 负责 access/refresh/session 闭环。
- `ICurrentUser` / 只读 `ITenantContext` 统一当前用户和请求租户上下文。
- Refresh Token 采用 `v1.{tenantId}.{sessionId}.{secret}` 结构,刷新和退出先解析租户再按 `TenantId + SessionId + TokenHash` 定位
- Refresh Token 采用 `v2.{t|p}.{tenantId|-}.{sessionId}.{secret}` 结构,刷新和退出先验证 realm/Host/tenant再通过统一 Session Store 定位并撤销 token family
- EF Core Query Filter、写入拦截器和 PostgreSQL 组合约束共同阻断跨租户读写。
- PostgreSQL FK / unique / check / index 负责数据完整性底线。
- 审计事件表记录关键行为。
@@ -147,7 +148,7 @@ Tiku.IntegrationTests # API / EF 模型集成测试
数据库模型迁移已经完成到 greenfield 初始 schema
```text
Tiku.Infrastructure/Persistence/Migrations/20260727093301_InitialSchema.cs
Tiku.Infrastructure/Persistence/Migrations/20260728031410_InitialSchema.cs
```
当前 EF 模型覆盖:
@@ -171,12 +172,14 @@ Tiku.Infrastructure/Persistence/Migrations/20260727093301_InitialSchema.cs
已完成:
- JWT Bearer 认证
- 数据库 Session 校验;登出/撤销后旧 token 会被拒绝
- 手机号 + 密码登录
- 短信验证码登录
- 微信网页 OAuth 登录
- 微信小程序登录
- ASP.NET Core Identity 密码、锁定、SecurityStamp、强制改密、TOTP 和恢复码
- `kid` 的 RSA JWT Bearer 认证和旧公钥轮换验证
- tenant/platform 双 realm 与 Host、tenant claim、数据库 Session 联合校验
- Session family 原子 refresh、重放撤销、logout 和 logout-all
- 手机号/邮箱/用户名 + 密码登录、短信验证码登录和安全短信发送入口
- 微信网页 OAuth 和微信小程序登录,外部身份不保存 `session_key`
- 数据库 tenant/platform RBAC、MFA policy、资源型授权和 DataScope SQL。
- 按有效权限生成 tenant/platform UI 菜单 bootstrap菜单不作为 API 授权依据。
- 租户级身份 Provider 配置解析。
- 当前用户 `/api/me`
- 当前租户 `/api/tenants/current`
@@ -184,6 +187,8 @@ Tiku.Infrastructure/Persistence/Migrations/20260727093301_InitialSchema.cs
- Host 解析的前端运行时配置 `/api/runtime/bootstrap`
- 统一异常响应和请求日志。
完整安全策略、Host 判定矩阵和登录/Session 文字流程图见 [`docs/architecture/authentication-authorization-security.md`](docs/architecture/authentication-authorization-security.md)。
### 已迁移 API
2026-07-27 运行时 OpenAPI 基线包含 192 个路径、237 个操作。已完成的业务/API 闭环包括:
@@ -250,3 +255,14 @@ dotnet ef migrations script \
--project Tiku.Infrastructure \
--startup-project Tiku.DbMigrator
```
首次部署可在迁移完成后一次性创建平台超级管理员:
```bash
export TIKU_BOOTSTRAP_PLATFORM_ADMIN_EMAIL='admin@example.com'
export TIKU_BOOTSTRAP_PLATFORM_ADMIN_PASSWORD='replace-with-a-strong-temporary-password'
export TIKU_BOOTSTRAP_PLATFORM_ADMIN_NAME='Platform Administrator'
dotnet run --project Tiku.DbMigrator -- --bootstrap-platform-admin
```
该命令只允许在不存在任何平台角色用户绑定时执行。创建的账号必须在首次登录时修改临时密码并完成 TOTP MFA 注册;检测到已有平台管理员时命令会拒绝重复引导。不要把临时密码写入仓库配置或命令行参数。