核心概念解析:身份提供商、服务提供商与协议家族

说实话,刚接触多云身份管理那会儿,我也被一堆缩写搞得头晕。IdP、SP、SAML、OIDC、SCIM……每个词背后都是一套协议,一套逻辑。但你别怕,这些东西说白了就是「怎么证明你是谁」和「怎么把证明传过去」的问题。

我习惯先画一张图,把几个核心角色的关系理清楚。你看下面这张结构图,基本就是多云身份体系的骨架。

多云身份核心概念关系图 多云身份核心概念关系图 用户 / 浏览器 / 客户端 身份提供商 (IdP) Azure AD / Okta / Keycloak 服务提供商 (SP) AWS / GCP / 内部应用 协议层:SAML 2.0 / OIDC / OAuth 2.0 用户同步:SCIM 2.0 认证请求 访问资源 断言 / 传递 核心流程:用户 → 请求访问 SP → 重定向到 IdP 认证 → IdP 返回断言/ → SP 验证并授权

身份提供商(IdP)—— 你是谁,我说了算

身份提供商,简称 IdP。它的职责很简单:存储用户身份信息,并负责认证。你想想看,你在公司里登录内部系统,输入密码后,是谁在验证你的密码?是 IdP。

常见的 IdP 有 Azure Active Directory、Okta、Keycloak,还有 Google 账号体系。我个人习惯把 IdP 理解成「数字世界的户籍管理处」。它不关心你要去哪,它只负责确认「你是你」。

关键点:在多云架构里,IdP 是信任的起点。所有云服务都信任 IdP 签发的身份断言。一旦 IdP 被攻破,所有云资源都危险。所以,IdP 的安全防护是第一优先级。

服务提供商(SP)—— 你要用啥,我给你

服务提供商,简称 SP。它提供用户想要访问的资源或功能。比如 AWS 控制台、GCP 的 Cloud Console、Salesforce、Slack,这些都是 SP。

SP 不负责认证用户,它只负责授权。它收到 IdP 发来的身份信息后,决定「这个用户能看哪些页面,能操作哪些资源」。

我记得有一次帮客户做 AWS 与 Okta 的集成,客户问:「为什么我在 AWS 里还要再建一遍用户?」我说:「不用。AWS 是 SP,它信任 Okta 这个 IdP。用户登录 Okta 后,直接跳转到 AWS 就行,AWS 不需要存密码。」

SAML 2.0 —— 老牌协议,稳如老狗

SAML 2.0 是 Security Assertion Markup Language 的缩写。说白了,它是一种基于 XML 的协议,用于在 IdP 和 SP 之间交换认证和授权数据。

SAML 2.0 的核心是「断言」(Assertion)。IdP 生成一个 XML 文档,里面写着「用户张三已通过认证,他有这些属性,他有这些权限」。SP 拿到这个 XML,验证签名,然后放行。

我的经验:SAML 2.0 在企业级应用里非常常见,尤其是那些老牌 SaaS 和内部系统。但它的 XML 解析比较重,配置起来也繁琐。我曾经花了一整天调试一个 SAML 签名不匹配的问题,最后发现是证书换行符格式不对。嗯,这种坑踩过一次就记住了。

SAML 2.0 的典型流程是这样的:

  1. 用户访问 SP(比如 AWS 控制台)
  2. SP 发现用户未登录,生成 SAML 请求,重定向到 IdP
  3. 用户在 IdP 输入凭证(密码、MFA 等)
  4. IdP 生成 SAML 断言,通过浏览器 POST 回 SP
  5. SP 验证断言签名,创建用户会话

OIDC / OAuth 2.0 —— 现代应用的首选

OAuth 2.0 是授权框架,OIDC(OpenID Connect)是在 OAuth 2.0 之上加了一层身份认证。很多人搞混这两个东西,我简单解释一下:

  • OAuth 2.0:解决「我能让你做什么」的问题。比如你授权一个 App 访问你的 Google 日历,OAuth 2.0 负责颁发一个 Access ,App 拿着这个 去读日历。
  • OIDC:解决「你是谁」的问题。它在 OAuth 2.0 的基础上加了一个 ID (JWT 格式),里面包含用户的身份信息。

我建议你在多云场景里优先考虑 OIDC。为什么?因为它是基于 JSON 的,比 SAML 的 XML 轻量得多,而且天然适配移动端和单页应用。AWS、GCP、Azure 都支持 OIDC 作为身份联邦的方式。

注意:OAuth 2.0 本身不提供身份认证。如果你只用 OAuth 2.0 而没有 OIDC,你无法确认用户到底是谁。很多安全漏洞就是因为只用了 OAuth 2.0 的 Access 来「假装」认证用户。切记,认证用 OIDC,授权用 OAuth 2.0。

SCIM —— 用户同步的自动化管道

SCIM 全称 System for Cross-domain Identity Management。它的作用是自动把用户从 IdP 同步到 SP。

你想想看,如果公司有 5000 人,每个人都要在 AWS、GCP、Salesforce、Slack 里手动建账号,那运维团队得疯掉。SCIM 就是解决这个问题的。

SCIM 2.0 定义了一组 RESTful API,IdP 可以通过这些 API 在 SP 上创建、更新、删除用户和组。比如:

// 创建用户的 SCIM 请求示例
POST /scim/v2/Users
Content-Type: application/scim+json

{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "userName": "zhangsan@company.com",
  "name": {
    "givenName": "张三",
    "familyName": "张"
  },
  "emails": [{
    "value": "zhangsan@company.com",
    "type": "work",
    "primary": true
  }],
  "active": true
}

SCIM 的好处是标准化。不管 SP 是 AWS 还是 Azure,只要它实现了 SCIM 端点,IdP 就可以用同一套逻辑去同步。我曾经帮客户把 Okta 和多个云服务对接,SCIM 配置好之后,用户入职、离职、转岗全部自动化,再也不用人工操作了。

核心要点:SAML/OIDC 解决「登录」问题,SCIM 解决「账号管理」问题。两者缺一不可。没有 SCIM,你只能手动建账号,然后靠 SAML 登录;没有 SAML/OIDC,你只能每朵云各建一套密码,用户记不住。

协议对比:一张表看懂

我把这几个协议的核心差异整理成了一张表,方便你对照:

协议 主要用途 数据格式 适用场景 我的评价
SAML 2.0 企业级 SSO XML 老牌 SaaS、内部系统 稳定但重,配置繁琐
OIDC 身份认证 JSON (JWT) 现代应用、移动端、SPA 轻量灵活,推荐首选
OAuth 2.0 授权委托 JSON () API 授权、第三方访问 别用它做认证
SCIM 2.0 用户同步 JSON (REST) 多云用户生命周期管理 自动化必备

避坑指南:我踩过的几个坑

讲完概念,我分享几个真实踩过的坑,希望能帮你省点时间。

  • SAML 签名证书过期:我曾经在凌晨两点被电话叫醒,原因是 SAML 证书过期了,所有用户无法登录。从那以后,我养成了在证书到期前 30 天设置自动告警的习惯。
  • OIDC 的 issuer 不匹配:有一次配置 AWS 与 Keycloak 的 OIDC 联邦,一直报错。查了半天,发现 Keycloak 的 issuer URL 末尾多了一个斜杠。嗯,一个斜杠,排查了两小时。
  • SCIM 的批量操作限流:某次同步 1 万个用户到 Azure AD,结果 SCIM 请求被限流了。后来我加了指数退避重试逻辑,才搞定。大厂 API 都有限流,别硬来。

一个小建议:不管用 SAML 还是 OIDC,一定要在测试环境里完整走一遍流程。用 SAML 的话,可以用 samltool.io 解码断言看看内容;用 OIDC 的话,可以用 jwt.io 解码 ID 。亲眼看到 里的字段,比看文档直观得多。

好了,这一章的核心概念就这些。IdP 和 SP 是角色,SAML 和 OIDC 是认证协议,SCIM 是同步协议。把这几个东西搞清楚,后面搭建方案的时候就不会迷路。