0Pricing
Security+ Academy · 课时

联合身份:SAML、OAuth 与 OpenID Connect

了解 SSO、SAML 断言、OAuth 2.0 流程和 OpenID Connect 令牌如何让用户安全地在多个应用之间实现一次身份验证。

联合身份:SAML、OAuth 与 OpenID Connect 是 CoddyKit 上的免费 Security+ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Security+ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Security+ Academy 课程共包含 4 节课。

跨域身份问题

在现代企业中,员工需要访问数十个应用程序,包括云应用、SaaS 工具、合作伙伴门户和内部系统,而这些系统可能分别由不同的组织维护。为每个系统单独创建和管理账户既不安全(凭据数量不断增加),也效率低下。联合身份通过允许身份提供商(IdP)——一个受信任且权威的身份来源——对用户进行身份验证,并在组织边界之间向服务提供商(SP)共享经过验证的身份,解决了这一问题。用户只需验证一次身份,即可访问多个系统,而无需反复输入凭据。

单点登录(SSO)基础

单点登录(SSO)允许用户验证一次身份,然后在会话期间访问多个应用程序,而无需再次进行身份验证。用户登录身份提供商(企业 Active Directory、Okta、Azure AD),接收会话令牌或断言,然后在访问每个服务提供商时出示该令牌。SSO 通过减少用户需要管理的密码数量(从而减少密码重复使用)、支持集中实施身份验证策略,以及在 IdP 层面禁用账户后立即撤销所有集成应用程序中的访问权限来提升安全性。

SAML 2.0:基于 XML 的联合

SAML(安全断言标记语言)2.0是一项基于 XML 的开放标准,用于在身份提供商和服务提供商之间交换身份验证和授权数据。SAML 流程如下:(1) 用户访问服务提供商(例如 Salesforce);(2) SP 将用户重定向到身份提供商(例如 Okta);(3) 用户在 IdP 处进行身份验证;(4) IdP 签发包含用户身份和属性的已签名 XML SAML 断言;(5) 断言返回给 SP;(6) SP 使用 IdP 的公钥验证断言签名并授予访问权限。SAML 广泛用于 Web 应用程序的企业 SSO。

<!-- Simplified SAML Assertion structure -->
<saml:Assertion xmlns:saml='urn:oasis:names:tc:SAML:2.0:assertion'
  IssueInstant='2026-06-21T10:00:00Z'
  ID='_abc123'>
  <saml:Issuer>https://idp.company.com</saml:Issuer>
  <saml:Subject>
    <saml:NameID>alice@company.com</saml:NameID>
  </saml:Subject>
  <saml:Conditions NotBefore='2026-06-21T10:00:00Z'
                   NotOnOrAfter='2026-06-21T10:05:00Z'/>
  <saml:AttributeStatement>
    <saml:Attribute Name='groups'>
      <saml:AttributeValue>Sales</saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
  <!-- Signature verifies IdP signed this assertion -->
</saml:Assertion>

SAML 角色:IdP、SP 和主体

SAML 联合中有三方参与。主体是寻求访问权限的用户(或系统),由其发起身份验证过程。身份提供商(IdP)是权威的身份来源,负责验证主体身份并签发断言;示例包括 Microsoft Azure AD、Okta、Ping Identity 和 ADFS。服务提供商(SP)使用断言,并据此授予访问权限;示例包括 Salesforce、Google Workspace、AWS 以及任何启用 SAML 的应用程序。SP 和 IdP 会预先交换元数据,以建立信任关系;元数据包含双方的端点 URL 和签名证书。

OAuth 2.0:授权框架

OAuth 2.0是一种授权框架(而不是身份验证协议),允许第三方应用代表用户访问资源,而不会暴露用户凭据。典型用例是:“允许此照片编辑应用访问您的 Google Photos。”OAuth 2.0 定义了四种角色:资源所有者(用户)、客户端(第三方应用)、授权服务器(签发令牌)和资源服务器(托管受保护资源)。用户向客户端授予授权,客户端接收一个访问令牌并将其出示给资源服务器,而始终无需获取用户的实际密码。

OAuth 2.0 授权码流程

授权码流程是 Web 应用程序最安全的 OAuth 2.0 流程。流程如下:(1) 客户端携带请求的作用域将用户重定向到授权服务器;(2) 用户在授权服务器处进行身份验证并授予同意;(3) 授权服务器重定向回客户端,并附带一个生命周期较短的授权码;(4) 客户端通过携带客户端凭据的服务器到服务器调用,将授权码交换为访问令牌(以及可选的刷新令牌);(5) 客户端使用访问令牌调用资源服务器。授权码交换在服务器端完成,可防止访问令牌暴露在浏览器历史记录或日志中。

# OAuth 2.0 Authorization Code Flow (step 3-4)
# Step 3: User is redirected back to client with auth code
# GET https://app.example.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

# Step 4: Client exchanges code for access token (server-to-server)
curl -X POST https://auth.example.com/oauth2/token \
  -d 'grant_type=authorization_code' \
  -d 'code=SplxlOBeZQQYbYS6WxSbIA' \
  -d 'redirect_uri=https://app.example.com/callback' \
  -d 'client_id=client_abc' \
  -d 'client_secret=secret_xyz'
# Response: {'access_token': 'MTQ0Nj...', 'token_type': 'Bearer', 'expires_in': 3600}

OpenID Connect:为 OAuth 添加身份验证

OpenID Connect(OIDC)是构建在 OAuth 2.0 之上的身份验证层。OAuth 仅提供授权(访问令牌证明客户端可以执行哪些操作);OIDC 增加了身份验证(ID 令牌证明用户是谁)。OIDC 在 OAuth 流程中添加 openid 作用域,并在访问令牌旁返回一个已签名的JWT(JSON Web Token)ID 令牌。ID 令牌包含用于识别用户的声明(姓名、电子邮件、sub[主体标识符])。如今,OIDC 已成为面向消费者的 SSO 主流协议——“使用 Google/Apple/Microsoft 登录”按钮都使用 OIDC。

# OIDC ID Token is a JWT with three base64url-encoded parts:
# header.payload.signature

# Decoded payload example:
# {
#   'iss': 'https://accounts.google.com',
#   'sub': '110169484474386276334',
#   'aud': 'client_id_abc123',
#   'exp': 1750000000,
#   'iat': 1749996400,
#   'email': 'alice@gmail.com',
#   'name': 'Alice Smith',
#   'email_verified': true
# }

# The signature is verified with the IdP's public key (from JWKS endpoint)

JWT:现代身份验证中的令牌

JSON Web Tokens(JWT)是一种紧凑且适合 URL 的格式,用于在各方之间表示声明。JWT 由三部分组成,各部分使用 base64url 编码并以句点分隔:Header(算法和令牌类型)、Payload(声明:iss、sub、aud、exp、iat 以及自定义声明)和Signature(用于验证令牌完整性的加密签名)。JWT 是自包含的,因此资源服务器无需回调授权服务器即可验证它们,从而提升性能并支持无状态架构。关键安全要求是:始终验证 JWT 签名,并检查 exp(过期时间)和 aud(受众)声明。

# Decode a JWT (header and payload are just base64 encoded)
import base64, json

jwt = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiZXhwIjoxNzUwMDAwMDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
parts = jwt.split('.')
print('Header:', json.loads(base64.b64decode(parts[0] + '==')))
print('Payload:', json.loads(base64.b64decode(parts[1] + '==')))
# Signature (parts[2]) must be verified with IdP public key!

SAML、OAuth 与 OIDC:何时使用哪一种

理解每项标准适用的场景对于 Security+ 考试至关重要。SAML 2.0:用于 Web 应用程序的企业 SSO、基于浏览器的流程和 XML 断言。虽然较为传统,但已在企业中广泛部署。OAuth 2.0:用于 API 授权,即授予第三方应用对资源的受限访问权限;不会直接验证用户身份。OIDC:用于面向消费者和现代企业的身份验证(SSO),构建在 OAuth 2.0 之上,并返回用于标识用户的 JWT ID 令牌。实际应用中,企业环境通常使用 SAML 实现应用程序 SSO,使用 OIDC 实现 API/移动端身份验证。现代云原生环境更偏好 OIDC 而非 SAML,因为 OIDC 使用 JSON/JWT 格式,并且对移动端支持更好。

联合身份攻击向量

联合身份系统会引入特定的攻击向量。断言重放攻击:攻击者截获 SAML 断言并重放,以获取访问权限。可通过缩短断言生命周期并使用一次性断言 ID 来缓解。XML 签名包装(XSW):在 SAML 中,攻击者有时可以操纵已签名的 XML,在保持原始内容签名有效的同时修改声明。JWT 算法混淆:如果服务器同时接受 RS256(非对称)和 HS256(对称)算法,攻击者可以将服务器公钥用作 HS256 的 HMAC 密钥,从而伪造 JWT。始终验证算法标头是否与预期算法匹配。开放重定向器:OAuth 重定向 URI 必须进行精确匹配,以防止令牌通过重定向到攻击者控制的网站而被窃取。

目录联合与 SCIM

企业身份联合通常需要在系统之间同步用户身份数据。SCIM(跨域身份管理系统)是一项 REST API 标准,用于自动执行身份提供商与已连接服务提供商之间的用户配置和取消配置。当新员工被添加到 Azure AD(IdP)时,SCIM 会自动在 Salesforce、Slack、GitHub 以及其他兼容 SCIM 的应用中创建其账户。员工离职时,SCIM 会同时停用所有账户,从而关闭孤立账户可能被利用的时间窗口。SCIM 通过处理 SSO 协议未涵盖的生命周期管理,对 SSO 协议(SAML/OIDC)形成补充。

快速检查

测试您对本课 CompTIA Security+(SY0-701)概念的理解。

课程回顾

在本课中,您学习了:SAML 2.0使用 XML 断言实现企业级基于浏览器的 SSO;OAuth 2.0是用于委派 API 访问权限的授权框架;OpenID Connect在 OAuth 之上增加了身份验证(JWT ID 令牌);SCIM自动化管理联合系统中的身份生命周期。本课程“身份验证与授权”到此结束——接下来,我们将学习网络安全基础。

常见问题解答

「联合身份:SAML、OAuth 与 OpenID Connect」课时是免费的吗?

是的 — 「联合身份:SAML、OAuth 与 OpenID Connect」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Security+ Academy 课程的其余内容,请升级到 CoddyKit PRO。 Security+ Academy 课程共包含 4 节课。

「联合身份:SAML、OAuth 与 OpenID Connect」这节课中我会学到什么?

了解 SSO、SAML 断言、OAuth 2.0 流程和 OpenID Connect 令牌如何让用户安全地在多个应用之间实现一次身份验证。 你通过在浏览器中直接运行的动手代码来练习 Security+ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Security+ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Security+ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「联合身份:SAML、OAuth 与 OpenID Connect」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Security+ Academy 课中编写并运行代码吗?

能。每节 Security+ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 密码策略与多因素身份验证
  2. 生物识别与基于令牌的身份验证
  3. 授权模型:RBAC、MAC 与 DAC
  4. 联合身份:SAML、OAuth 与 OpenID Connect
← 返回 Security+ Academy