一、SSO(单点登录)原理
SSO 是一种认证模式,允许用户只需一次登录,即可访问多个互信系统,无需再次登录。
1. 基本原理
- 用户访问受保护的系统(应用 A)。
- 应用 A 检查用户是否已登录,若未登录,跳转到认证中心(Identity Provider, IdP)。
- 用户在 IdP 中完成认证后,IdP 生成一个令牌或票据,返回给应用 A。
- 应用 A 验证令牌后,允许用户访问。
- 其他应用(如应用 B)收到用户访问时,可基于该令牌快速完成登录。
2. 核心流程
- 身份验证:认证中心负责验证用户身份。
- 票据管理:使用票据或令牌在多系统之间传递身份。
- 信任机制:不同系统之间通过共享公钥、密钥或第三方 IdP 形成信任关系。
二、SSO 常用协议
以下是几种常用协议及其特点:
1. OAuth 2.0
- 用于授权,支持第三方应用访问资源。
- 用户授权后,获取
access_token
,然后通过此令牌访问资源。
2. OpenID Connect (OIDC)
- 基于 OAuth 2.0 的身份认证协议。
- 在 OAuth 的基础上增加
id_token
,用于用户身份信息传递。
3. SAML(Security Assertion Markup Language)
- 基于 XML 的协议,广泛应用于企业和跨域认证场景。
- 通过 SAML 断言在 IdP 和 SP(Service Provider)之间传递用户身份。
4. CAS(Central Authentication Service)
- 一个开源的 SSO 协议,提供中心化认证服务。
- 简单易用,但较少支持现代化需求。
三、常用工具和平台
-
开源工具
- Keycloak:支持 OIDC 、OAuth 和 SAML,易于集成,适用于多种场景。
- Shibboleth:基于 SAML,专注于教育机构。
- Auth0:支持多种协议,功能强大但部分功能收费。
- CAS Server:简单轻量的开源 SSO 实现。
-
企业级工具
- Okta:商业化平台,提供丰富的企业级功能。
- Azure AD:微软的企业身份管理服务,支持 SSO。
- Ping Identity:专注于企业级身份认证和 SSO。
- 阿里云/腾讯云 IAM:国内云厂商提供的 SSO 服务。
四、企业级多系统对接实现
1. 对接模式
- 通过 IdP:所有系统接入一个统一的 IdP(如 Keycloak、Azure AD)。
- Token 验证:系统通过共享 Token 验证用户身份。
- 代理模式:通过反向代理或 API Gateway,实现认证代理。
2. 步骤
- 统一认证中心:搭建 IdP,配置 SSO 协议(OAuth、OIDC、SAML)。
- 接入系统:在各系统中实现对认证中心的集成(如配置 SAML 或 OIDC 客户端)。
- Token 传递:通过浏览器 Cookie、JWT、Session 或 URL 参数在系统间传递身份信息。
- 权限管理:结合 RBAC/ABAC 模型进行细粒度授权。
3. 配置域名
-
统一域名管理:使用统一的二级域名(如
sso.company.com
)作为认证入口。 -
跨域支持:在 Cookie 设置中启用跨域共享(
SameSite=None
且Secure
)。 -
DNS 配置:通过企业 DNS 将各系统指向相应服务(如
app1.company.com
,app2.company.com
)。 - HTTPS:确保所有通信通过 HTTPS 进行,防止中间人攻击。
五、示例配置
以 Keycloak 为例:
- 安装 Keycloak
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
-
创建 Realm 和客户端
- 创建一个
company-realm
,并配置对应的客户端应用(如app1
和app2
)。
- 创建一个
-
配置客户端
- 在应用中集成 OIDC 客户端库(如
spring-security-oauth2
或oidc-client.js
)。 - 设置回调 URL,如
https://app1.company.com/callback
。
- 在应用中集成 OIDC 客户端库(如
-
设置域名
- 配置
DNS
指向和nginx
路由规则,将app1.company.com
指向相应服务。
- 配置
通过上述方法,企业可以构建一个高效、安全的 SSO 体系,实现多系统统一认证和快速切换。