第十一章:单点登录(SSO)与联邦身份

“一次登录,处处访问 — 这是 SSO 的承诺,也是安全工程的挑战。”

        mindmap
  root((SSO 与联邦身份))
    SSO 方式
      Cookie SSO
      Token SSO
      SAML SSO
      OIDC SSO
    SAML 2.0
      Assertion
      SP-Initiated
      IdP-Initiated
    联邦身份
      信任关系
      身份映射
      跨组织
    方案对比
      Keycloak
      Okta
      Azure AD
    

11.1 SSO 解决什么问题

在没有 SSO 的世界里,用户需要为每个应用维护独立的账号和密码:

没有 SSO:
用户 ──▶ App1 (用户名/密码 A)
用户 ──▶ App2 (用户名/密码 B)
用户 ──▶ App3 (用户名/密码 C)
→ 密码疲劳、弱密码、密码复用

有了 SSO:
用户 ──▶ IdP (一次登录) ──▶ App1 ✅
                          ──▶ App2 ✅
                          ──▶ App3 ✅
→ 一套凭证、统一管理、更好的安全性

11.2 SSO 实现方式

基于 Token 的 SSO(跨域)

适用场景:不同域名的应用
使用 OIDC 或 OAuth2 实现

┌──────────┐    ┌──────────────┐
│  用户     │───▶│  IdP         │
│ (浏览器)  │    │ (Keycloak)   │
│          │◀───│ 返回 id_token │
└────┬─────┘    └──────────────┘
     │
     │  携带 Token 访问
     ├──────────────────▶ app1.com ✅
     ├──────────────────▶ app2.org ✅
     └──────────────────▶ app3.io  ✅

11.3 SAML 2.0

SAML(Security Assertion Markup Language)是企业级 SSO 的标准协议。

核心概念

概念

说明

IdP(Identity Provider)

身份提供者,负责认证用户

SP(Service Provider)

服务提供者,依赖 IdP 的认证结果

Assertion

身份断言,包含用户身份信息

Binding

消息传输方式(HTTP-POST、HTTP-Redirect)

Metadata

IdP 和 SP 的配置信息(XML 格式)

SP-Initiated 流程

┌──────────┐    ┌──────────┐    ┌──────────┐
│  用户     │    │    SP    │    │   IdP    │
│ (浏览器)  │    │ (应用)   │    │ (认证)   │
└────┬─────┘    └────┬─────┘    └────┬─────┘
     │  1. 访问 SP   │               │
     │──────────────▶│               │
     │               │  2. 生成      │
     │               │  AuthnRequest │
     │  3. 重定向到 IdP              │
     │◀──────────────│               │
     │──────────────────────────────▶│
     │               │  4. 用户登录  │
     │               │               │
     │  5. 重定向回 SP(携带 SAML Response)
     │◀──────────────────────────────│
     │──────────────▶│               │
     │               │  6. 验证      │
     │               │  Assertion    │
     │  7. 登录成功  │               │
     │◀──────────────│               │

SAML vs OIDC 对比

维度

SAML 2.0

OIDC

数据格式

XML

JSON/JWT

传输方式

HTTP-POST/Redirect

HTTP REST

Token 大小

大(XML)

小(JWT)

移动端支持

实现复杂度

适用场景

企业 SSO

Web/Mobile/API

标准组织

OASIS

OpenID Foundation

年代

2005

2014

11.4 联邦身份

联邦身份允许不同组织之间建立信任关系,实现跨组织的身份认证:

┌──────────────────┐         ┌──────────────────┐
│   组织 A          │         │   组织 B          │
│  ┌──────────┐    │  信任    │    ┌──────────┐  │
│  │  IdP A   │◀───┼─────────┼───▶│  IdP B   │  │
│  │ (Azure AD)│    │  关系    │    │ (Okta)   │  │
│  └──────────┘    │         │    └──────────┘  │
│       │          │         │         │        │
│  ┌────▼─────┐    │         │    ┌────▼─────┐  │
│  │ 用户 A   │    │         │    │ 用户 B   │  │
│  │ 可以访问  │────┼─────────┼───▶│ 可以访问  │  │
│  │ 组织B资源 │    │         │    │ 组织A资源 │  │
│  └──────────┘    │         │    └──────────┘  │
└──────────────────┘         └──────────────────┘

联邦信任模型

模型

描述

适用场景

点对点

两个组织直接建立信任

合作伙伴

Hub-and-Spoke

中心 IdP 连接多个 SP

企业集团

网状

多个 IdP 互相信任

行业联盟

信任框架

基于标准的多方信任

政府/教育

11.5 Kerberos 认证协议

Kerberos 是 Windows Active Directory 的核心认证协议:

┌──────────┐    ┌──────────┐    ┌──────────┐
│  客户端   │    │   KDC    │    │  服务器   │
│          │    │ (密钥分发 │    │          │
│          │    │  中心)    │    │          │
└────┬─────┘    └────┬─────┘    └────┬─────┘
     │  1. AS-REQ    │               │
     │  (用户名)     │               │
     │──────────────▶│               │
     │  2. AS-REP    │               │
     │  (TGT)        │               │
     │◀──────────────│               │
     │  3. TGS-REQ   │               │
     │  (TGT + 服务名)│               │
     │──────────────▶│               │
     │  4. TGS-REP   │               │
     │  (Service Ticket)              │
     │◀──────────────│               │
     │  5. AP-REQ                    │
     │  (Service Ticket)             │
     │──────────────────────────────▶│
     │  6. AP-REP                    │
     │  (认证成功)                    │
     │◀──────────────────────────────│

11.6 企业 SSO 方案对比

特性

Keycloak

Okta

Azure AD

类型

开源自托管

SaaS

SaaS

协议

OIDC/SAML/OAuth2

OIDC/SAML

OIDC/SAML/WS-Fed

成本

免费

按用户付费

Microsoft 365 含

自定义

高(SPI 扩展)

用户联邦

LDAP/AD/Social

广泛

AD/B2B/B2C

MFA

内置

内置

内置

部署

Docker/K8s

Keycloak Docker 部署

# 快速启动 Keycloak
docker run -d --name keycloak \
    -p 8080:8080 \
    -e KEYCLOAK_ADMIN=admin \
    -e KEYCLOAK_ADMIN_PASSWORD=admin \
    quay.io/keycloak/keycloak:latest \
    start-dev

# 生产部署(PostgreSQL + HTTPS)
docker compose up -d
# docker-compose.yml
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: keycloak_password
    volumes:
      - pgdata:/var/lib/postgresql/data

  keycloak:
    image: quay.io/keycloak/keycloak:latest
    command: start
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: keycloak_password
      KC_HOSTNAME: auth.example.com
      KC_HTTPS_CERTIFICATE_FILE: /opt/keycloak/conf/cert.pem
      KC_HTTPS_CERTIFICATE_KEY_FILE: /opt/keycloak/conf/key.pem
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: secure_password
    ports:
      - "8443:8443"
    depends_on:
      - postgres

volumes:
  pgdata:

11.7 小结

  • SSO 通过一次登录访问多个应用,提升用户体验和安全性

  • SAML 2.0 是企业级 SSO 标准,但较重;OIDC 更现代、更轻量

  • 联邦身份 实现跨组织的身份互信

  • Keycloak 是最流行的开源 SSO 方案,支持 OIDC/SAML/OAuth2

  • 选择 SSO 方案时需考虑:协议支持、部署方式、成本、扩展性