简介:面向政务信息化建设者的统一用户身份管控与认证平台建设方案,共19页,重点解决政务端组织与用户统一管理、单点登录、集中/分级鉴权及账号同步等核心问题。文档在整体架构上按认证数据、认证服务中心、业务子系统三层展开,并给出功能架构图;平台能力方面梳理了用户、票据、应用、角色、权限、区域与组织机构6大类共28个认证鉴权服务接口。账号同步部分则涵盖新建账号经Kafka推送消息监听入库、历史存量账号批量导入与统一账号前缀处理等内容。资源为1个PDF文件,压缩包约2.42MB,结构完整,适合政务平台架构师、安全运维人员及统一认证项目团队参考。已有210人学习,读者可据此获取平台建设目标、接口能力清单与落地实施思路,用于方案设计、选型评估或需求梳理。
1. 统一用户身份管控与认证平台到底解决什么问题:先分清身份管和认证这两件事
做内部系统交付的人多半遇到过这种需求:公司有 OA、企业邮箱、工单系统、GitLab、云控制台五六套系统,每套各建各的账号和密码,员工每天要记好几组口令,离职半年的人在业务系统里还留着有效账号。甲方这时候拿出来的,往往就是一份“统一用户身份管控与认证平台建设方案”。这类方案的核心就两件事:身份管(把散落在各系统的账号、组织、岗位数据收拢成一套权威身份库)和认证(让用户登录任何系统都走同一个认证入口,一次登录、处处可用)。本文按一份 19 页方案的常见写法,拆开讲清楚架构怎么搭、身份源怎么接、协议怎么选、坑在哪儿,以及平台上线后怎么验证它真的合格。
2. 平台总体架构与核心模块拆解:四层架构和两条数据流
2.1 四层架构:接入层、认证层、身份层、审计层怎么分工
统一身份管控与认证平台在架构上一般分成四层,每层职责单一,边界清晰,后面排错才不抓瞎。从上到下分别是:
- 接入层:负责终止外部请求,做 TLS 卸载、限流、防暴力破解。常见做法是前置 Nginx 或 API 网关,把认证中心的地址隐藏在后面。这层不碰业务逻辑,只做流量转发和基础防护。
- 认证层:承载登录页、单点登录(SSO)、多因素认证(MFA)、会话管理。用户输入密码、扫码、收验证码都发生在这层,认证通过后签发会话凭证,再交给下游应用校验。这一层是整个平台里改动最频繁、最需要小心设计的部分。
- 身份层:管账号、组织、岗位、组关系。身份源同步引擎、账号生命周期状态机、权限模型的底层数据都在这层。它不关心用户怎么登录,只关心“这个人是谁、属于哪个部门、处于什么状态”。
- 审计层:记录登录事件、管理员操作、策略变更。审计数据独立存储,不被业务库的清理任务误删,还要能导出成报表应付合规检查。
平台内部有两条关键数据流。一条是身份同步流:身份源(HR 系统、AD、企业微信等)产生人员变动事件,同步引擎拉取或接收事件后做数据标准化,再推送到下游各业务系统。另一条是认证流:用户访问应用 → 应用把请求重定向到认证中心 → 认证中心验证凭证 → 签发令牌 → 应用校验令牌 → 放行。这两条流在设计时不能交叉:身份同步不能依赖认证流程的可用性,认证流程也不能因为同步任务卡住而中断。
2.2 模块职责边界:身份治理与权限策略不能混在一个服务里
很多方案翻车,源头是把身份管理和权限管理揉在一个模块里。身份治理关心的是账号的生命周期:入职创建、转岗调整、离职禁用。权限策略关心的是“谁在什么条件下能访问什么应用和数据”。两者有关联,但变更频率和业务语义完全不同。
我一般会明确四个独立模块:
| 模块 | 核心职责 | 典型数据 | 变更频率 |
|---|---|---|---|
| 身份治理 | 账号全生命周期管理、组织架构同步 | 员工编号、姓名、部门、状态 | 高,随人员变动 |
| 认证引擎 | 凭证校验、SSO 会话、MFA 策略 | 密码哈希、MFA 绑定信息 | 中,随策略调整 |
| 权限策略 | RBAC/ABAC 模型、应用授权范围 | 角色、资源、授权规则 | 中,随业务变更 |
| 审计服务 | 行为记录、合规报表、异常检测 | 登录日志、管理员操作日志 | 只读追加 |
身份治理模块在人员和权限上要做分离,哪怕同一个服务里也要拆成不同的数据表,避免“改了一个人的部门,顺手把他的角色也带偏了”。
2.3 一份 19 页建设方案的段落结构:从现状调研到上线计划怎么排
“共 19 页”这个篇幅限制,其实倒逼方案写作者把每页都用在刀刃上。常见的 19 页结构是固定的:背景现状、建设目标、总体架构、模块设计、认证与协议、身份数据同步、安全合规、部署迁移、实施计划、风险应对。
我按这个排法给出一个可直接套用的段落规划:
| 页段 | 内容 | 该页要回答的问题 |
|---|---|---|
| 1-2 | 现状与痛点 | 现在有几套系统、多少账号、发生过什么安全事故 |
| 3-4 | 建设目标与范围 | 一期做到什么程度,哪些系统先接入 |
| 5-8 | 总体架构与模块设计 | 四层架构图、每个模块的核心功能 |
| 9-11 | 认证协议与登录体验 | 选什么协议、SSO 和 MFA 怎么触发 |
| 12-13 | 身份数据与同步设计 | 主身份源是谁、同步链路怎么走 |
| 14-15 | 安全与合规 | 等保要求、密码策略、审计留存 |
| 16-17 | 部署方式与迁移步骤 | 新建还是替换、老系统怎么接 |
| 18 | 实施计划与里程碑 | 几周完成、谁负责什么 |
| 19 | 风险与应对 | 同步失败、员工抵制的预案 |
这个结构的好处是评审会上每个角色都能找到自己关心的页:领导看 1-4 页和 18 页,技术负责人看 5-13 页,安全与运维看 14-17 页,最后 19 页是用来回答“你凭什么觉得不会出问题”的。
3. 身份源接入与账号生命周期:把 AD、HR 系统和云应用汇成一套账号
3.1 主身份源怎么定:AD/LDAP、企业微信/钉钉、HR 系统,谁说了算
身份源选错是后续所有同步问题的根源。我经手的项目里有一半以上的数据冲突,都是因为没有明确“谁的数据是权威的”。
主身份源的选择规则很直接:
- 有 HR 系统的,以 HR 系统为主源。员工的工号、姓名、部门、汇报关系、入离职状态都在 HR 系统里最准确。AD 和业务系统里的人可能是旧的,但 HR 系统里的一定是最新的。
- 没有 HR 系统的小团队,以 AD/LDAP 为主源。AD 天然承担了账号认证和基础组织结构的职责,运维在里面建组织单位(OU)和用户,再由统一平台往下分发。
- 企业微信/钉钉这类协作平台,一般做补充源,不做主源。因为它们的人员信息可能是从别的系统手动维护的,也可能出现花名、昵称等不规范的字段,拿来做权威源会污染下游。
主源只能有一个,或者明确按字段拆分权威:工号以 HR 为准,手机号和头像以企业微信为准。但不要把同一字段交给两个源同时写,否则后面必然要写“解决冲突”的补丁逻辑,最后还是一团乱麻。
3.2 增量同步与事件回调:两种同步链路的设计取舍
身份数据同步有两种主流链路:定时全量/增量拉取,和事件实时回调。常见做法是两种配合:夜间全量对账,平时靠事件回调实时更新。
下面是一个从 HR 系统拉取组织人员增量数据的接口示例,统一身份平台作为同步消费者:
import requests import hashlib # HR 系统开放增量查询接口,cursor 是上次同步的位置 resp = requests.get( "https://hr.internal.example.com/api/v1/employee/changes", params={"cursor": last_cursor, "limit": 500}, headers={"Authorization": "Bearer " + hr_api_token}, timeout=10, ) data = resp.json() for item in data["items"]: # 统一身份库以 employee_no 作为唯一键 identity = { "employee_no": item["employee_no"], "name": item["name"], "department": item["department_path"], "position": item["position"], "status": "active" if item["on_board"] else "disabled", "email": item["email"], "mobile": item["mobile"], } # 先做字段哈希,值没变就跳过,减少下游推送压力 digest = hashlib.md5(str(identity).encode("utf-8")).hexdigest() if digest != last_digest.get(identity["employee_no"]): push_to_downstream(identity)这段代码的逻辑是:先通过游标cursor做增量拉取,只拿上次同步之后变化的员工数据;对每条记录,以employee_no为身份主键,转成统一身份模型;再计算一次内容摘要,内容没变的记录直接跳过,避免把无变化的账号重复推送到下游应用。limit控制在 500 条以内,防止一次同步太多把下游应用压垮;timeout设置 10 秒,接口超时就走失败重试队列。
事件回调链路则是 HR 系统在员工入离职时主动推送消息到统一身份平台的 Webhook 端点,平台收到消息后立即处理,秒级生效。这适合离职禁用、账号锁定的场景,不能等定时任务跑完才处置。
3.3 账号状态机与离职处置:入职、调岗、离场的流转规则
设计账号生命周期,至少要定义四种状态和状态之间的流转条件:
| 状态 | 含义 | 可执行操作 |
|---|---|---|
| pending | 已从 HR 同步,待开通 | 可登录,但仅限基础应用 |
| active | 正常在职 | 全量授权 |
| disabled | 离职/长期休假 | 禁止登录,保留数据 |
| terminated | 离职已过保留期 | 账号删除,数据归档 |
转岗场景容易被忽略:员工从 A 部门调到 B 部门,部门路径变了,权限却可能残留旧部门的。所以状态机里要加一条“转岗触发权限重算”的规则,而不是只更新一个部门字段。
离职处置是我最常提醒三方的点:账号禁用后要同时做三件事,禁用登录、撤销令牌、回收邮箱和文件权限。只禁用登录不撤销已签发的会话令牌,这个人带着手机里的登录态还能继续访问系统,等于白禁。统一身份平台在收到离职事件后,要强制将用户的会话标记为失效,这一步通常通过会话存储的全局注销接口实现。
4. 认证协议选型与登录链路落地:OIDC、SAML、CAS 三选一之后怎么接
4.1 协议对比与选型边界:老兼容性和新扩展性怎么平衡
认证协议选型没有绝对最好的,只有最合适的。下面是三个主流协议的对比:
| 维度 | OIDC | SAML 2.0 | CAS |
|---|---|---|---|
| 适用场景 | 新系统、前后端分离、移动端 | 企业间联邦、大型老门户 | 传统 Java 应用、校内/企业内部 |
| 消息格式 | JWT + JSON | XML 断言 | 自定义 Ticket |
| 移动端支持 | 好,原生支持 | 差,偏浏览器重定向 | 一般 |
| 单点登出 | 支持,实现成本中等 | 支持,配置复杂 | 支持,但全局登出要自己写 |
| 对接成本 | 低,库多文档多 | 高,XML 配置繁琐 | 中,但生态老旧 |
我的选型经验是:新业务系统一律走 OIDC;已经有一堆老系统集成过 CAS 的,保留 CAS 作为过渡协议,新系统不要再新增 CAS 对接;外部合作伙伴要访问内部应用的,用 SAML 做身份联邦。平台建设初期如果允许同时启多种协议,要提前规划好协议适配层,否则后面每接一个应用都要改认证中心。
4.2 授权码模式的最小登录链路:对接接口与参数说明
OIDC 授权码模式是最常用的对接方式。应用引导用户跳转到认证中心登录,登录成功后认证中心回跳应用并附上授权码,应用再用授权码换取令牌。下面是用 Python 实现令牌换取的请求示例:
import requests # 用授权码和客户端密钥换令牌,redirect_uri 必须与发起登录时的回调地址一致 resp = requests.post( "https://sso.internal.example.com/oauth2/token", data={ "grant_type": "authorization_code", "code": auth_code, "redirect_uri": "https://app.internal.example.com/callback", "client_id": "gitlab-prod", "client_secret": "your-client-secret", }, timeout=5, ) tokens = resp.json() # 返回的 access_token 是 JWT,应用方要用公钥验签而不是调远程接口 decoded = jwt_decode(tokens["access_token"], sso_jwks_public_key) print(decoded["sub"], decoded["email"])这段代码的核心在最后一步:拿到access_token后必须本地验签,不要每次请求都远程调认证中心的用户信息接口,否则高并发时认证中心会先被打挂。sub是用户在统一身份库中的唯一标识,业务系统应该用这个值关联本地用户,而不是用邮箱或姓名。
4.3 条件访问与 MFA 触发策略:什么场景强制二次认证
多因素认证不能无脑全局开启,否则用户每天上班要验证七八次,很快会有投诉。我一般按风险和信任等级做条件访问策略:
| 触发条件 | 策略 |
|---|---|
| 新设备首次登录 | 强制 MFA |
| 管理后台访问 | 每次强制 MFA |
| 异地登录、夜间登录 | 强制 MFA,并告警 |
| 已信任设备 + 内网/IP 白名单 | 仅密码,不触发 MFA |
| 高风险应用(财务、运维) | 每次强制 MFA |
MFA 方式按员工接受度排序:企业微信/钉钉扫码最友好,其次硬件密钥,短信验证码最容易磨损用户耐心,只能做后备手段。平台上线第一个月不要全量推 MFA,先拿一个部门试点两周,收集反馈再放开。
5. 统一身份管控与认证平台落地避坑:五类高频故障的处理记录
5.1 多源身份数据打架:账号被覆盖、字段丢失
现象:同一个员工的手机号,在 AD 里是旧号,在企业微信里是新号,两边的同步任务交替执行,统一身份库中的手机号一会儿是旧的一会儿是新的,下游系统跟着坐过山车,用户收不到验证码。
原因:没有明确字段级别的权威源,两个身份源同时对同一字段有写权限。
解决:把身份源按字段拆成主次。手机号字段只允许企业微信源写入,AD 源的手机号映射到扩展属性,不参与主库更新。同时在同步引擎里加一层“字段权限表”,源身份标识 + 目标字段决定谁能写,别的源写同一字段直接拒绝。
5.2 老系统不支持标准协议:表单代填和反向代理怎么兜底
现象:内部一套 2012 年上线的老旧系统,只有用户名密码登录,不认 OIDC 也不认 SAML,改造它要动老代码,没人敢碰。
原因:老系统当初是自建认证,不是基于第三方标准协议开发的,集成方改不动源码。
解决:两类兜底方案。一是表单代填,统一身份平台保存用户在各老系统的账号密码,用户登录主平台后,平台自动用账密代填到老系统的登录页,实现“伪 SSO”。二是反向代理,在老系统前面加一层代理,拦截登录请求,用统一身份平台的会话替代老系统会话。但这两个方案都只能在老系统没有强制验证码或设备指纹的前提下用,有验证码的老系统得走客户端插件方案,成本更高。
5.3 会话策略设错:登录频繁失效与全局登出失灵
现象:用户早上登录过,半天后点开某个应用又被要求重新登录,气得直接提工单。而管理员在后台禁用某员工账号后,该员工手机上还保持登录状态,能继续访问应用。
原因:会话超时时间设成了全局统一的 30 分钟,所有应用共享同一套会话有效期;而禁用账号只做了登录态禁止,没有主动撤销已签发的令牌。
解决:会话时长按应用安全等级分档,普通应用 8 小时,财务和运维系统 1 小时,管理后台 30 分钟。账号禁用务必调用全局会话销毁接口,把该用户在所有接入应用中的会话全部标记失效。上线前测试一定要验证“禁用账号 → 用户下一次访问被踢”这条链路。
5.4 权限回收滞后:离职账号还能访问内部系统
现象:员工离职后,统一身份库里账号已禁用,但在某个数据仓库系统里,他还是能看到历史报表数据。数据仓库用的是它自己的权限表,不跟随统一身份账号状态变化。
原因:统一身份平台只管了“能不能登录”,没有管“数据级权限”。老系统内部权限与账号绑定,账号禁用了但数据权限没清。
解决:在同步链路里增加“离职账号数据权限回收”任务,离职事件发生后,向下游推送“禁用 + 权限清理”两条指令,下游系统收到后清除该用户的业务数据授权。如果下游系统不提供接口,只能靠定时任务比对离职名单,人工介入处理,这属于方案里必须写明的边界风险。
5.5 审计日志缺字段:等保合规检查第一轮就翻车
现象:合规检查要求提供过去 6 个月全部登录行为的审计记录,导出后发现大量日志缺少来源 IP、缺少 MFA 是否通过的标记,没法通过。
原因:认证中心只记录了“成功/失败”二元结果,没有记录设备指纹、认证类型、地理位置等关键字段。日志系统也没有做防篡改,运维可以直接改库。
解决:审计日志强制包含:用户 ID、认证方式、MFA 结果、来源 IP、UA、目标应用、时间戳、事件结果。日志存储用追加写模式,普通管理员不能变更和删除。上线时就要把审计字段清单发给合规方确认,不要等检查前才补。
6. 验证平台是否合格:三个验收实验与一组长期跟踪指标
平台建完,验收不能只看演示页面跑通。我会做三个实验,每一个都能暴露隐藏问题。
第一个实验是“新员工入职全链路贯通”。在 HR 系统新建一个测试员工,记录从数据入库、身份同步到各应用开好账号的总耗时。合格标准是 10 分钟内该员工能登录至少三个核心应用。超过 30 分钟说明同步链路有阻塞,多半是某个下游应用的增量接口只支持全量拉取。
第二个实验是“认证流与登出流反向验收”。用两个不同协议接入的应用,先全流程登录确认一次登录都能进,再做全局登出,确认两个应用同时失效。这一条最容易在 SAML 单点登出上出问题,如果通告没配好,会出现主应用登出了,子应用还在会话里。
第三个实验是“离职账号越权访问模拟”。直接拿一个已禁用账号的令牌,逐个访问接入应用,确认全部被拒。这个实验要放在生产环境换班低峰期做,但必须做真实验证,不能只看配置。
上线后还要盯一组长期指标:账号同步延迟 P95 是否控制在 10 分钟内,SSO 登录成功率是否在 99.9% 以上,平均认证耗时是否低于 1.5 秒,以及密码重置工单量是否逐月下降。这四个指标能直接衡量平台是否真正解决了当初的问题。
我经手这类方案时最大的教训是:身份管控平台的上线不是终点,而是身份数据治理的开始。那些验收时没暴露的数据杂质,会在三个月后以各种奇怪的方式冒出来。所以方案里一定要给同步任务留好失败重试和人工修复通道,别指望一套自动化永远不出错。希望帮到你。
本文还有配套的精品资源,点击获取