一、为什么需要身份联邦
企业在数字化转型过程中,账号体系往往沿着业务线自发生长。财务系统一套目录、研发协作一套目录、供应链门户又一套目录,用户名、口令策略、过期周期各不相同。这种"账号孤岛"在单一法人主体内部已经造成重复建设与运维负担,一旦业务边界跨越机构,问题会被进一步放大。
设想这样一个场景:市级民政业务需要打通 11 个委办局子系统,每个系统原本由不同厂商承建,认证方式从静态口令到硬件介质不一而足;又或者一家外企的中国分支需要复用总部的云端身份目录,同时又要满足本地远程接入的双因素要求。若是逐个系统改造登录逻辑、互相同步账号,不仅工程量巨大,更会带来凭据冗余、责任边界模糊、泄露面扩大等风险。
身份联邦(Identity Federation)的目标,就是在不复制主凭据、不托付对方密码的前提下,让一个机构(身份提供方,IdP)签发的身份断言能够被另一个机构(服务提供者,SP)在不建立共享账号库的情况下接受。它解决的是"互信"而非"同库":各方保留自己的身份主数据,只在需要时临时交换经过签名的身份证据。
这也是企业身份管理与普通单点登录 SSO 的关键差异。内部 SSO 解决的是"同一主体、多系统一次登录",而联邦解决的是"不同主体、跨机构一次登录"。前者信任边界在组织内,后者信任边界跨越组织,因此它对协议规范、密码学保障、属性最小化提出了更严苛的要求。多因素认证 MFA 在联邦中不只是登录环节的一道关卡,更是断言里amr(认证方法)与level(保障级别)的载体,决定了下游 SP 愿意开放多少资源。
从安全度量看,每多同步一份账号,就多一个可被攻破的凭据副本,也多一处需要满足等保与密评的存储点。当机构数量从两家增长到 N 家,账号副本呈乘数膨胀,运维与合规成本同步抬升。联邦把"N 份账号库"收敛为"N 个信任锚",使安全投入从乘性增长回落到线性可控。这也解释了为什么在跨机构协作里,联邦往往不是可选项,而是把身份风险压到可接受水位的前提。
二、身份联邦的核心概念
理解联邦,先要建立几个基础概念。
2.1 IdP 与 SP
- IdP(Identity Provider):掌握用户主身份、负责认证并执行 MFA 的一方。IdP 在用户通过认证后,签发包含用户身份与属性的断言(assertion)。
- SP(Service Provider):提供具体业务资源的一方。SP 不保存用户的认证凭据,只消费 IdP 签发的断言,并据此建立本地会话。
- 信任锚(Trust Anchor):双方预先交换并固化的密码学材料,通常是 IdP 的签名证书公钥,以及 SP 的元数据(实体 ID、断言消费地址、支持的绑定)。它是"为什么 SP 要相信这份断言"的根本依据。
2.2 联邦与协议的关系
联邦是一种"互信编排"能力,具体落地依赖标准协议。当前主流有两条技术路线:
| 维度 | SAML 2.0 | OIDC(基于 OAuth 2.0) |
|---|---|---|
| 断言载体 | XML Sig/Enc 的 SAML Assertion | JSON Web Token(JWT) |
| 签名算法 | RSA-SHA256、SM2-SM3(国密) | JWS(含 ES256/SM2) |
| 发现机制 | 手动交换元数据 XML | 自动发现/.well-known/openid-configuration |
| 适用场景 | 传统 Web 系统、政企内网 | 移动端、API、云原生 |
| 属性传递 | AttributeStatement | ID Token Claims / UserInfo |
| 会话建立 | 浏览器 POST/Artifact 绑定 | 授权码换取 Token |
需要强调的是,国密改造场景下,SM2 用于断言签名、SM3 用于摘要,这两者在 SAML 与 OIDC 上都有对应的扩展实现,不等于简单"换把算法"——它要求证书体系、签名校验、密钥轮换全链路支持。国密算法从根证书、中间证书到终端实体证书的整条链都必须合规,否则验签在语义上通过、在密评上仍不达标。
2.3 信任锚的密钥生命周期与吊销
联邦的长期安全不靠一次配置,而靠密钥生命周期管理。签名证书存在有效期,到期前必须轮换;轮换窗口内新旧证书需并行生效一段时间,避免断言在过渡期被拒之门外。吊销方面,若 IdP 私钥疑似泄露,SP 侧应能基于证书指纹黑名单即时拒绝,而非被动等待证书自然过期。离线固化带来的代价是"吊销传播慢"——这是联邦相比中心化认证固有的权衡,工程上要用短有效期断言叠加主动黑名单来弥补。此外,artifact 绑定能减少断言在网络中的暴露,但它要求 SP 与 IdP 间存在后端直连通道,跨机构公网场景下未必可行,须结合远程接入链路综合判断,不能脱离拓扑谈安全。
三、SAML 联邦机制剖析
SAML 联邦的核心是元数据交换与签名断言。下面以一次浏览器发起的 SP 发起单点登录为例,描述时序。
1. 用户访问 SP 资源路径:/app/report 2. SP 检测无会话,生成 AuthnRequest(含 AssertionConsumerServiceURL、RequestID) 3. 浏览器携带 AuthnRequest 重定向至 IdP 的 SSO 端点 4. IdP 校验 RequestID 与 SP 实体 ID,执行本地认证 + MFA 5. IdP 构造 SAML Response,使用 IdP 私钥对 Assertion 签名 6. 浏览器以 HTTP POST 将 Response 送回 SP 的 ACS 地址 7. SP 用本地固化的 IdP 公钥验证签名与 Conditions(NotBefore/NotOnOrAfter) 8. SP 解析 Subject 与 AttributeStatement,建立本地会话IdP 的元数据是关键锚点。一个最小化的元数据片段如下:
<EntityDescriptorentityID="idp.example.com"><IDPSSODescriptorprotocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><KeyDescriptoruse="signing"><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIIC...(IdP 签名证书,Base64)</ds:X509Certificate></ds:X509Data></ds:KeyInfo></KeyDescriptor><SingleSignOnServiceBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"Location="idp.example.com/saml/sso"/><NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat></IDPSSODescriptor></EntityDescriptor>这里有两个工程要点。第一,签名证书必须离线固化在 SP 侧,不能依赖运行时从网络拉取元数据(否则攻击者可在中间篡改公钥)。第二,NameID 格式优先使用persistent,避免使用会暴露真实姓名的transient或邮件格式,这是最小属性暴露的第一道关。第三,Signing 与 Encryption 的密钥应分离,签名密钥长期稳定便于验签,加密密钥可独立轮换。
在交换元数据时,务必先对签名证书计算指纹并人工比对,再固化到 SP:
# 计算 IdP 签名证书指纹,离线与对方人工比对,杜绝"拉到即信"openssl x509-inidp_signing.crt-noout-fingerprint-sha256openssl x509-inidp_signing.crt-noout-enddate四、OIDC 联邦机制剖析
OIDC 把"认证"与"授权"分离,用授权码流(Authorization Code Flow)完成联邦。它的优势在于自动发现,SP 只需预先知道 IdP 的 issuer 与一小段注册信息。
1. SP 读取 IdP 发现文档:GET idp.example.com/.well-known/openid-configuration 2. 文档返回 issuer、authorization_endpoint、token_endpoint、jwks_uri、id_token_signing_alg_values_supported 3. 用户访问 SP,SP 重定向至 authorization_endpoint,带上 client_id、scope=openid profile、redirect_uri、state、nonce 4. IdP 认证后返回 code 5. SP 后端用 code 向 token_endpoint 换取 id_token(JWT)与 access_token 6. SP 用 jwks_uri 公布的公钥验证 id_token 签名,并校验 iss、aud、exp、nonce 7. 解析 id_token Claims 建立会话一个解码后的 ID Token 结构示例:
{"iss":"idp.example.com","sub":"a1b2c3d4-0001","aud":"sp-portal","exp":1735689600,"iat":1735686000,"nonce":"r4nd0m-n0nce","amr":["pwd","otp"],"level":"loa2"}注意amr字段记录了认证方法(如口令 + 一次性口令),level表示认证保障级别(LOA)。在联邦场景下,SP 应依据amr与level决定资源开放程度——这正是跨机构互信中实现"分级授权"的抓手。比如仅用静态口令达到的级别,不应被允许访问高敏感接口;必须出现otp或 FIDO2/WebAuthn 这类强因子,才放行管理面。
对 ID Token 的服务端校验,建议写成显式的防御式逻辑:
defverify_id_token(raw,jwks):header,payload,sig=split_jwt(raw)kid=header.get("kid")pub=jwks.get(kid)# SM2 / RSA 公钥,按 kid 取assertpubisnotNone,"未知 kid"assertverify_sig(pub,header+"."+payload,sig),"签名无效"assertpayload["iss"]==EXPECTED_ISSUER,"issuer 不匹配"assertpayload["aud"]==CLIENT_ID,"audience 不匹配"assertpayload["exp"]>now(),"已过期"assertpayload["nonce"]==session_nonce,"nonce 重放"returnpayload五、联邦架构与数据流编排
在真实生产环境,机构往往不会只对接一个外部 IdP,而是需要同时联邦多个上级、平级、外部伙伴身份源。此时宜引入一个"联邦代理(Broker)"层,统一对外承接 SP 请求、对内编排多个 IdP,并完成协议转换。Home Realm Discovery(主域发现)是代理层的入口逻辑:当用户来自不同机构,代理依据其邮箱域或组织标识,把认证请求路由到正确的上游 IdP,避免让用户手动选择。
下面的表格给出了一种典型的联邦代理分层职责:
| 层级 | 职责 | 关键能力 |
|---|---|---|
| 接入层 | 承接 SP 的 SAML/OIDC 请求 | 协议终端、ACS/回调路由 |
| 代理层 | 选择 IdP、发起上游认证 | Home Realm Discovery、路由 |
| 适配层 | 上游协议与下游协议互转 | SAML↔OIDC 映射、Claims 转换 |
| 信任层 | 管理元数据与签名校验 | 证书库、密钥轮换、吊销检查 |
| 治理层 | 属性裁剪与审计留痕 | 最小暴露、风险策略 |
一个跨机构登录的序列示意(以 SAML SP 对接 OIDC IdP 为例):
SP(SAML) -> Broker : AuthnRequest(HTTP-Redirect) Broker -> IdP(OIDC) : 授权码重定向 IdP -> 用户 : 认证 + MFA IdP -> Broker : code Broker -> IdP : code 换 id_token Broker -> Broker : id_token -> SAML Assertion(属性映射 + SM2 重签) Broker -> SP : SAML Response(POST) SP -> SP : 验签 + 建会话这种代理模式的收益在于:SP 侧只需理解一种协议,协议转换、上游互信、密钥管理全部收敛到代理层,显著降低每个业务系统的改造成本。同时,代理层成为最小属性暴露的天然闸门——所有跨域属性流转都必须经过它的过滤策略。
六、落地实践
6.1 与外部 IdP 的联邦对接
跨机构对接的第一步,永远是元数据或发现文档的可信交换,而不是先写业务代码。实践中建议:
- 离线交换 IdP 的签名证书指纹(SHA-256),在 SP 侧做人工比对确认,杜绝"自动信任任意元数据"。
- 约定
entityID/issuer白名单,任何不在白名单内的 issuer 一律拒绝。 - 明确断言有效期窗口(建议
NotOnOrAfter不超过 5 分钟),并对时钟漂移设置容差(如 30 秒)。 - 对签名算法做强约束,拒绝已被攻破的 rsa-sha1 等弱算法族,仅放行 RSA-3072 与 SM2 这类强算法。
在统一身份认证平台的建设中,以安当ASP为例,其 SSO 模块同时作为 SP 与 IdP 角色,可以与外部云端目录或上级机构 IdP 建立双向联邦:作为 SP 时消费上游断言,作为 IdP 时向业务系统签发断言。这种双向能力让它在"既要接入总部身份、又要向本地系统发身份"的混合架构中,省去额外代理组件,把信任锚、协议转换与属性过滤收敛到同一套引擎。
6.2 最小属性暴露
联邦最大的风险不是"认证失败",而是"过度共享"。一个常见错误是把用户的全部目录属性(姓名、手机号、部门全称、工号、邮箱)一股脑塞进断言。最小属性暴露原则要求:
- 仅传递 SP 完成授权所必需的属性,例如只需
sub与一个角色标识。 - 用不可反查的持久化匿名 ID 替代真实姓名/工号。
- 在代理层做属性裁剪(attribute filtering),下游断言绝不携带上游未显式授权的字段。
- 对
amr、level等安全上下文字段按需透传,但避免过度细化到可定位个人的组合。
以安当ASP为例,其 SLA 与 SYP 模块在共享账号与单机离线场景下,进一步把"谁、何时、用什么因子"的认证事实作为最小证据传递,而不是同步完整账号资料——这在轨交单机离线、电商共享账号等弱网或无中心化场景里,既满足审计归因,又避免凭据外溢。这种"只传证据、不同步主数据"的思路,正是联邦与账号同步在本质上的分野。
6.3 协议转换与国密对齐
当上游是 OIDC、下游是 SAML,或反过来,适配层需要把 Claims 映射为 AttributeStatement、把 JWT 签名转换为 XML 签名。映射规则建议以"语义而非字段名"对齐:
| OIDC Claim | SAML Attribute | 说明 |
|---|---|---|
| sub | NameID | 主体标识 |
| urn:oid:0.9.2342.19200300.100.1.3 | 邮件 | |
| groups | role | 角色/组 |
| level | loa | 认证保障级别 |
国密环境下,断言签名须走 SM2,摘要走 SM3,且证书需由合规 CA 签发并纳入密钥生命周期管理。密评关注的正是"签名不可伪造、密钥可轮换、过程可验证",这与联邦的信任锚机制内在一致。若上游 IdP 暂不支持国密,代理层可在本地用 SM2 对转换后的断言重新签名,使对外发放的断言满足本地合规,而上游仍维持原有算法——这种"外联标准、内发国密"的双栈策略,是混合合规环境的务实路径。
6.4 行业落地片段
把抽象机制落到具体行业,可以看到联邦与模块能力的映射关系:
- 政务多系统打通:某市级民政局将 11 个委办局子系统统一接入,独立登录平均耗时从 3 分钟压缩到 10 秒,核心收益来自一次认证、多系统通行,消除了重复输入与多因子重复触发。
- 制造现场终端:苹果供应链工厂约 300 台终端采用 SLA 指纹模块做本地身份绑定,把强生物因子下沉到产线设备,避免口令在大量终端间流转。
- 共享账号治理:电商场景中多个运营共用后台账号,SYP 模块把"共享账号是谁在用、何时用"做实,使共享不等于匿名。
- 弱网离线:轨交等单机离线环境,SLA 模块在断网时仍完成本地验证,联网后再做一致性核对。
- 外部远程接入:外企中国分支复用总部身份并叠加本地双因素,满足远程接入的强认证要求。
这些片段共同说明:联邦的价值不只在"打通",更在"以最小暴露、最强因子、最合规的方式打通"。
七、关键参数、性能与合规
把联邦能力落到生产,以下参数需要明确基线。
| 参数项 | 建议值 | 说明 |
|---|---|---|
| 断言有效期 | ≤ 5 分钟 | 缩短重放窗口 |
| 时钟容差 | 30 秒 | 防止跨机时钟漂移 |
| 会话超时 | 30 分钟无操作 | 兼顾安全与体验 |
| 签名算法 | RSA-3072 / SM2 | 国密场景用 SM2-SM3 |
| 密钥轮换周期 | 365 天 | 证书到期前 30 天预警 |
| 并发断言校验 | 本地验签,无外网依赖 | 避免在线校验成为瓶颈 |
性能方面,联邦登录的耗时主要取决于远程接入链路的往返与本地验签。本地验签(尤其是 SM2 软验签)通常在毫秒级,瓶颈多在跨机构的网络往返与 MFA 交互。上述民政局案例中,单系统独立登录 3 分钟到 10 秒的改善,主要来自消除重复认证而非单点提速。
在并发模型上,联邦代理应把验签做成无状态本地操作,不依赖对 IdP 的在线查询,这样断言量增长时只需横向扩容代理节点,不会因回源 IdP 形成瓶颈。会话层面建议把本地会话与联邦断言生命周期解耦:断言短命(分钟级)用于跨界信任,本地会话可稍长(半小时级)用于连续操作,二者通过后端刷新机制衔接,既控风险又不伤体验。需要提醒的是,解耦后本地会话的安全水位不能低于断言,否则跨界信任的收紧会被本地长会话抵消,等于在联邦门口加了锁、却在屋里开着窗。
合规维度,身份联邦必须满足等保 2.0 三级对"身份鉴别、访问控制、安全审计"的要求;采用国密算法并通过密评(GM/T 0051、GM/T 0028)是政务与关键信息基础设施的硬性门槛;信创环境下还需适配麒麟、统信等操作系统的运行,以及鲲鹏、龙芯等 CPU 架构。这些并非"附加项",而是联邦能否在受监管行业落地的准入条件。同时,ISO 9001、ISO 20000、ISO 27001 等体系认证从质量、服务与信息安全三个侧面约束了平台的工程与服务成熟度。需要指出,联邦本身不改变等保的边界划分——跨机构互信后,责任主体、数据流图与审计归属仍须在合规文档中清晰界定。
八、常见坑与排查
坑一:时钟不同步导致断言被拒。症状是所有联邦登录偶发失败,日志报NotOnOrAfter校验不过。排查先比对 IdP 与 SP 系统时钟,优先用同一时间源同步;临时放大容差仅作定位,根因须修正时钟。
坑二:签名算法协商不一致。IdP 用 SM2 签名,SP 仅配置了 RSA 校验证书,结果验签永远失败。排查需核对元数据WantAuthnRequestsSigned、签名算法声明与本地证书类型,确保两端算法族一致。
坑三:属性名映射错位。OIDC 侧groups映射到 SAML 侧role,但 SP 读取的是urn:oid命名,导致授权为空。排查用断言明文(测试环境)打印 AttributeStatement 与 Claims,逐字段比对语义。
坑四:重定向端点被列入跨站保护拦截。联邦依赖浏览器跨域重定向与 POST,若 SP 的 ACS 地址与注册redirect_uri不完全一致(多一个斜杠都不行),IdP 会拒绝发放。排查时逐字符比对注册的回调与运行期地址。
坑五:弱算法未禁用。仍接受已废弃的弱签名算法或早期传输层版本,给中间人留出空间。排查时显式声明禁用名单,只放行强算法族,并把算法协商失败计入监控告警。
坑六:元数据在线拉取被投毒。运行期自动从远端拉取 IdP 元数据并直接信任,攻击者劫持后可替换公钥。治理上必须离线固化指纹并定期人工复核,禁止"拉到即信"。
坑七:nonce/state 未校验引发重放。只看签名不看nonce,攻击者可截获合法断言反复提交。排查时确认每次授权都绑定一次性nonce与state,并在服务端做消费标记。
坑八:断言携带过多个人属性。为"方便后续扩展"把整份目录灌入断言,扩大泄露面也拖慢传输。排查以最小暴露原则回收紧每一个非必要字段。
方案参考
身份联邦不是把账号搬到一个中心库,而是在保留各方身份主权的同时,用签名断言交换"可信的身份证据"。落地的通用方法论可以归纳为四步:
- 锚定信任:离线交换并固化 IdP 签名材料,建立 issuer/entityID 白名单,拒绝任意自动信任。
- 收敛协议:在存在多上游、多下游时引入联邦代理,统一协议转换与属性映射,降低每个业务系统的改造面。
- 裁剪属性:以"业务必要"为唯一标准做最小暴露,用匿名持久 ID 替代可定位个人的真实字段,在代理层强约束属性过滤。
- 对齐合规:将等保 2.0 三级、国密 SM2/SM3、密评与信创适配作为架构的硬约束前置,而非上线后的补丁。
在产品定位上,安当ASP 作为面向企业级场景的统一身份认证平台,其 SSO、MFA、OTP、RADIUS、SLA、SYP 六大模块各自对应网络接入、远程访问、共享账号到单机离线等不同信任边界;对 SAML 2.0、OAuth 2.0、OIDC、LDAP、RADIUS、FIDO2、WebAuthn 等协议的支持,使它能够同时扮演 SP 与 IdP 双重角色,适配与外部 IdP 的双向联邦。对需要在受监管行业完成跨机构互信、又受国密与信创约束的团队,这类"协议全栈 + 合规内建"的定位,是评估联邦方案时的一个务实参照——但最终选型仍应回到自身的身份主权边界、属性最小化要求与运维可达性上做权衡。