# 企业身份接入与验收 ## 工程边界 当前仓库已经提供企业身份工程基线: - OpenID Connect 授权码登录,服务端保存授权状态并校验 `state`、`nonce` 和 ID Token。 - 身份提供方配置、客户端密钥加密保存、启停和安全审计。 - 以 `(provider, subject)` 唯一绑定本地用户,不以可变邮箱作为默认身份主键。 - 首次登录可创建无本地密码账号;停用账号不能通过企业登录恢复访问。 - 企业组织声明只同步管理员显式登记的业务用户组映射,不覆盖其他手工用户组。 - 标准化目录记录可幂等批量同步,并保存完成、部分成功或失败的运行结果。 - LDAP 提供连接配置和标准化目录适配边界,尚未在应用进程内实现 LDAP 搜索或轮询。 工程完成不等于企业环境验收完成。真实 IdP、LDAP 目录、网络出口、证书和组织声明仍需按本文 最后的清单联调。 ## 部署配置 1. 配置稳定的 `AI_CREDENTIAL_ENCRYPTION_KEY`。身份提供方密钥与模型、渠道凭据共用这套 Fernet 加密能力;密钥丢失后已有密文不可恢复。 2. 将 `FRONTEND_APP_URL` 设置为用户访问的前端 HTTPS 根地址。 3. 将 `OIDC_CALLBACK_BASE_URL` 设置为企业 IdP 可访问的后端 HTTPS 根地址。留空时,服务端 会从当前请求推导根地址。 4. 执行迁移和治理初始化: ```bash python manage.py migrate python manage.py bootstrap_governance ``` 5. 在“系统治理 → 企业身份”新增 OIDC 提供方,并在 IdP 登记精确回调地址: ```text https://<后端域名>/api/identity/auth/oidc//callback ``` 生产 OIDC 地址必须使用 HTTPS;仅在 Django 调试模式下允许本机 `localhost` 或 `127.0.0.1` 使用 HTTP。 ## OIDC 声明 默认声明映射如下,可在治理页按企业 IdP 的实际声明修改: | 平台字段 | 默认声明 | 说明 | |---|---|---| | 稳定身份 | `sub` | 必填,同一提供方内不可变化 | | 登录账号 | `preferred_username` | 首次创建本地账号时使用,冲突会生成唯一后缀 | | 邮箱 | `email` | 用于资料同步,不默认用于绑定已有账号 | | 显示名称 | `name` | 同步到本地显示名称 | | 企业组织 | `groups` | 只匹配已登记的组织映射 | 默认禁止按邮箱自动链接已有账号,以避免邮箱声明错误导致账号接管。确需迁移存量账号时,应由 管理员评估 IdP 的邮箱验证策略后,在提供方 `configuration` 中显式启用 `allow_email_linking`,并先用脱敏账号演练。 ## 目录适配器契约 治理页和 `POST /api/identity/providers/{id}/directory-sync` 接收标准化成员数组: ```json { "records": [ { "subject": "employee-1001", "username": "zhangsan", "email": "zhangsan@example.com", "display_name": "张三", "active": true, "groups": ["IT-Support"] } ] } ``` - `subject` 是必填稳定标识。 - 同一提供方和 `subject` 重复提交只会更新原身份。 - 单次最多 1000 条,单条冲突会记录在同步运行中,不会伪造整批成功。 - `active=false` 会停用对应本地账号。 - 连接 LDAP、HR 或 IAM 的可信适配器负责读取企业目录并转换为上述结构;浏览器和审计日志 不保存 Bind password。 ## 接口与权限 | 接口 | 权限/用途 | |---|---| | `GET /api/identity/auth/providers` | 匿名读取已启用 OIDC 登录入口 | | `GET /api/identity/auth/oidc/{slug}/start` | 启动授权码登录 | | `GET /api/identity/auth/oidc/{slug}/callback` | IdP 回调、身份同步并建立 Django 会话 | | `GET/POST/PATCH /api/identity/providers` | `system.setting.manage` 管理提供方 | | `GET/POST/DELETE .../group-mappings` | `system.setting.manage` 管理受控组织映射 | | `POST .../directory-sync` | `system.setting.manage` 执行标准化目录同步 | 密钥不会通过管理接口返回;操作审计只记录修改字段、提供方、计数和错误类型,不记录令牌、 Client secret 或 Bind password。 ## 真实企业环境验收 - [ ] IdP 发现文档、JWKS 和令牌端点均通过受信任 HTTPS 证书访问。 - [ ] 正常授权码登录成功,篡改 `state`、错误 `nonce`、过期或错误签名 ID Token 均被拒绝。 - [ ] 同一 `sub` 重复登录只关联一个本地账号,账号名冲突不会串号。 - [ ] 停用提供方、停用本地账号和无效组织声明都按预期阻断或忽略。 - [ ] 企业组织新增、移除后只改变已登记映射对应的业务用户组。 - [ ] IdP 不可用时,本地受控管理员账号仍可完成应急登录。 - [ ] 登录成功、失败、提供方修改、映射变更和目录同步均可在审计日志追溯。 - [ ] LDAP/目录适配器在真实目录完成分页、超时、证书、增量和停用成员演练。