feat(security): add distributed authorization foundation

This commit is contained in:
2026-07-29 10:40:10 +08:00
parent c7f9a4e3c9
commit df88fa19cb
76 changed files with 22020 additions and 88 deletions

View File

@@ -1,5 +1,7 @@
# 认证与授权待补强清单
> 2026-07-29 实施状态可信代理启动校验、外部登录成员生命周期、Redis 跨实例频控与故障关闭、数据库 Capability、事务化 System Scope 审计、MassTransit EF Bus/Consumer Outbox、浏览器 Cookie/CSRF 主链路及 endpoint manifest 已落地。生产网关 ACL、RabbitMQ 4.x 重启/积压演练和按 job type 迁移旧轮询 Worker 仍属于部署验收项。
当前生效规则见 [认证、授权与 Host 安全策略](authentication-authorization-security.md)。本文只记录尚需补强的安全事项,不重复描述已实现体系。
## P0可信代理与 Host fail-closed
@@ -10,6 +12,8 @@
- 受信代理只接受一跳转发,网关必须覆盖客户端伪造的 Forwarded Headers。
- API 公网入口必须只能由受信网关访问。
实现说明:应用已强制 `ForwardLimit=1`Production 缺少正式 Host、显式 `AllowedHosts` 或可信代理地址时启动失败;公网 ACL 和网关覆盖转发头由部署层落实。
验收:
- Host A + Tenant B token 返回 403。
@@ -23,6 +27,8 @@
- 首次外部登录是否允许创建学生成员,必须由租户自注册策略控制。
- 成员恢复只能由管理员显式操作并写审计。
实现说明:`TenantAuthPolicy.AllowExternalStudentSelfRegistration` 控制首次外部登录Disabled/Invited 不会被登录激活,管理员成员变更会同步撤销 Session、写审计并发布生命周期事件。
验收:
- Disabled 成员旧 access/refresh 立即失效。
@@ -43,6 +49,8 @@ Tenant Active
+ DataScope / Resource Scope
```
实现说明:`ProductModule``PlanModuleEntitlement``TenantModuleOverride``ICapabilityAccessEvaluator` 已进入数据库授权 Handler。模块目录采用渐进启用只有进入固定目录的模块才强制套餐校验避免迁移时误封未建档模块。
验收:
- 有 permission 但套餐不含模块,返回 403。
@@ -59,6 +67,8 @@ Tenant Active
- All-only 资源必须显式声明。
- 新增 Controller action 未进入 manifest 时测试失败。
实现说明:`AuthorizationManifestTests` 对全部 Controller HTTP Action 的 method、route、匿名标记和 policy 生成稳定摘要MVC convention 同时为全部非匿名 Controller endpoint 生成 realm、module、permission、operation、All-only 与 audit action 运行时元数据,变更会触发测试失败并要求安全评审。
验收:
- 列表、详情、创建、更新、删除、批量、导出和 Worker job 使用一致 DataScope。
@@ -70,6 +80,8 @@ Tenant Active
- 平台操作、Worker、迁移验证和受审计公共题库服务才允许使用 System Scope。
- 跨租户写操作必须落 `AuditLog`
实现说明:`SystemScopeRequest` 强制 caller、reason、target tenant 和 correlation ID旧参数签名已移除。成功路径的 entered 审计、跨租户业务写入和 completed 审计处于同一 PostgreSQL 事务,异常路径回滚业务并持久化 entered/failed 审计。
验收:
- 未声明 reason 的 System Scope 创建失败。
@@ -82,3 +94,5 @@ Tenant Active
- Access token 继续短期有效,不把角色和权限写入 JWT。
- 登录审计和错误响应避免泄露手机号、openId、邮箱完整值。
- 出现第三方生态登录、开放 API 或多客户端授权需求时,再评估 OpenIddict / OIDC不继续扩展私有协议。
实现说明:浏览器使用 `/api/browser-auth` + Secure/HttpOnly Cookie + Origin/CSRF 校验;原 `/api/auth` Bearer 契约继续供小程序、原生和服务调用。