单点登录介绍
11
min3.0k
字2025-12-16
2025-10-24
-
目录
什么是单点登录
单点登录(Single Sign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。
举个例子: 我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东国际、京东生鲜等子系统。
单点登录的好处
- 用户角度 :用户能够做到一次登录多次使用,无需记录多套用户名和密码,省心。
- 系统管理员角度 : 管理员只需维护好一个统一的账号中心就可以了,方便。
- 新系统开发角度: 新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时。
单点登录常见解决方案
如果是单个tomcat服务,session可以共享, 如果是多个tomcat,那么服务session不共享。为此我们需要提出针对单点登录的解决方案。
单点登录解决方案
- JWT(常见)
- Oauth2
- CAS
OAuth2.0
实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 Token,使得第三方应用能够通过该令牌获取相关的资源。
OAuth 2.0比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。 另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。
OAuth2.0是一种用于访问授权的行业标准协议,OAuth2.0用于为互联网用户提供将其在某个网站的信息授权给其他第三方应用、网站访问, 但是不需要将网站的账号密码给第三方应用、网站。
四种授权模式
1. 授权码模式 (Authorization Code)
这是最常用和最安全的授权模式,适用于有后端的Web应用。
流程:
- 用户访问客户端应用
- 客户端将用户重定向到授权服务器
- 用户在授权服务器上登录并授权
- 授权服务器将用户重定向回客户端,并携带授权码
- 客户端使用授权码向授权服务器请求访问令牌
- 授权服务器验证授权码并返回访问令牌
特点:
- 安全性高,授权码只能使用一次
- 适用于有后端的应用
- 支持刷新令牌
2. 简化模式 (Implicit)
适用于纯前端应用,如SPA(单页应用)。
流程:
- 用户访问客户端应用
- 客户端将用户重定向到授权服务器
- 用户在授权服务器上登录并授权
- 授权服务器直接将访问令牌返回给客户端
特点:
- 流程简单,适合前端应用
- 安全性相对较低
- 不支持刷新令牌
3. 密码模式 (Resource Owner Password Credentials)
用户直接将用户名和密码提供给客户端。
流程:
- 用户向客户端提供用户名和密码
- 客户端直接向授权服务器请求访问令牌
- 授权服务器验证用户凭据并返回访问令牌
特点:
- 流程简单
- 安全性低,需要高度信任客户端
- 适用于内部系统或高度信任的应用
4. 客户端凭证模式 (Client Credentials)
客户端以自己的名义请求访问令牌。
流程:
- 客户端向授权服务器请求访问令牌
- 授权服务器验证客户端凭据并返回访问令牌
特点:
- 适用于服务间通信
- 不涉及用户授权
- 适用于API访问
CAS (Central Authentication Service)
CAS是一个开源的企业级单点登录解决方案,由耶鲁大学开发。
CAS架构
CAS采用中心化认证架构,包含以下组件:
- CAS Server: 认证服务器,负责用户认证
- CAS Client: 客户端应用,需要集成CAS客户端库
- User: 最终用户
CAS认证流程
用户访问受保护资源
- 用户访问客户端应用
- 客户端检查用户是否已认证
重定向到CAS Server
- 如果用户未认证,客户端重定向到CAS Server
- 携带service参数(回调URL)
用户登录
- 用户在CAS Server上输入用户名和密码
- CAS Server验证用户凭据
生成票据
- 认证成功后,CAS Server生成TGT(Ticket Granting Ticket)
- 生成ST(Service Ticket)
重定向回客户端
- CAS Server将用户重定向回客户端
- 携带ST参数
验证票据
- 客户端使用ST向CAS Server验证
- CAS Server返回用户信息
建立会话
- 客户端建立本地会话
- 用户可访问受保护资源
CAS特点
优点:
- 成熟稳定,企业级应用广泛
- 支持多种认证方式(LDAP、数据库等)
- 支持代理认证
- 有完善的Java客户端库
缺点:
- 配置相对复杂
- 主要支持Java生态
- 性能相对较低
SAML (Security Assertion Markup Language)
SAML是一个基于XML的开放标准,用于在身份提供者(IdP)和服务提供者(SP)之间交换身份认证和授权数据。
SAML架构
- Identity Provider (IdP): 身份提供者,负责用户认证
- Service Provider (SP): 服务提供者,提供具体服务
- User: 最终用户
SAML认证流程
用户访问SP
- 用户访问服务提供者的应用
- SP检查用户是否已认证
重定向到IdP
- 如果用户未认证,SP生成SAML认证请求
- 将用户重定向到IdP
用户登录
- 用户在IdP上输入凭据
- IdP验证用户身份
生成SAML断言
- 认证成功后,IdP生成SAML断言
- 包含用户身份信息
返回断言
- IdP将SAML断言返回给SP
- 通过POST或重定向方式
验证断言
- SP验证SAML断言的签名
- 提取用户信息
建立会话
- SP建立本地会话
- 用户可访问服务
SAML特点
优点:
- 标准化程度高,跨平台支持好
- 安全性高,支持数字签名和加密
- 支持联邦身份管理
- 适合企业级应用
缺点:
- 基于XML,协议较重
- 配置复杂
- 调试困难
OIDC
OpenID Connect 是基于OAuth 2.0的身份认证协议,增加了Id Token。
OIDC是OAuth2.0的超集,可以理解为OIDC=身份认证+OAuth2.0.
OAuth2.0主要定义了资源的授权,而OIDC主要关注的是身份的认证。 (身份信息也属于资源,但是OAuth2.0中没有对身份信息包含哪些内容以及认证过程做完整定义)
举个例子:
我有一个google账号,我会使用许多google系的应用,如Gmail、Chrome等。通过OIDC(可能是定制版本), 我可以使用同一个google账号去登录这些google系应用(以及以google作为身份提供商的第三方应用)。甚至这些应用间可以以Google账号系统提供的ID Token来认证是不是同一个用户。
OIDC特点
优点:
- 基于OAuth 2.0,协议轻量
- 支持多种客户端类型
- 标准化程度高
- 适合现代Web应用和移动应用
缺点:
- 相对较新,生态还在发展
- 某些企业级功能不如SAML完善
协议对比与选择建议
协议对比表
| 特性 | OAuth 2.0 | OIDC | CAS | SAML |
|---|---|---|---|---|
| 主要用途 | 授权 | 身份认证+授权 | 单点登录 | 联邦身份管理 |
| 协议复杂度 | 中等 | 中等 | 简单 | 复杂 |
| 标准化程度 | 高 | 高 | 中等 | 高 |
| 跨平台支持 | 优秀 | 优秀 | 主要Java | 优秀 |
| 安全性 | 高 | 高 | 高 | 最高 |
| 性能 | 高 | 高 | 中等 | 中等 |
| 配置复杂度 | 中等 | 中等 | 简单 | 复杂 |
| 移动端支持 | 优秀 | 优秀 | 一般 | 一般 |
| 企业级功能 | 基础 | 中等 | 丰富 | 最丰富 |
选择建议
1. 选择OAuth 2.0的场景
- 第三方应用授权:需要让用户授权第三方应用访问自己的资源
- API访问控制:为API提供访问控制
- 移动应用:移动应用需要访问用户数据
- 微服务架构:服务间需要授权访问
2. 选择OIDC的场景
- 现代Web应用:需要身份认证的现代Web应用
- 移动应用:移动应用需要用户身份认证
- SPA应用:单页应用需要身份认证
- API + 身份认证:既需要API访问又需要身份认证
3. 选择CAS的场景
- Java生态:主要使用Java技术栈
- 企业内部系统:企业内部多个系统需要单点登录
- 简单部署:希望快速部署单点登录
- 传统Web应用:传统的Web应用集成
4. 选择SAML的场景
- 企业级应用:大型企业需要联邦身份管理
- 跨组织合作:不同组织间需要身份互信
- 高安全要求:对安全性要求极高的场景
- 标准化要求:需要严格遵循标准协议
混合使用策略
在实际项目中,可以根据不同场景混合使用多种协议:
- OIDC + OAuth 2.0:现代应用的标准组合
- SAML + OAuth 2.0:企业级应用,SAML用于身份认证,OAuth 2.0用于API授权
- CAS + OAuth 2.0:Java生态,CAS用于单点登录,OAuth 2.0用于API访问
实施建议
1. 评估现有系统
- 分析现有系统的技术栈
- 评估安全要求
- 确定集成复杂度
2. 选择合适协议
- 根据使用场景选择协议
- 考虑未来扩展性
- 评估实施成本
3. 分阶段实施
- 先实施核心功能
- 逐步扩展支持范围
- 持续优化用户体验
4. 安全考虑
- 使用HTTPS传输
- 实施适当的令牌过期策略
- 定期进行安全审计
5. 监控和维护
- 建立监控体系
- 定期更新和补丁
- 用户反馈收集
总结
单点登录是现代企业信息化建设的重要组成部分,选择合适的SSO解决方案需要考虑多个因素:
关键要点
- 协议选择:根据应用场景、技术栈和安全要求选择合适的协议
- 安全性:所有协议都支持HTTPS,但SAML提供最高的安全级别
- 易用性:CAS配置最简单,OIDC适合现代应用
- 扩展性:OAuth 2.0和OIDC在移动端和API访问方面表现最佳
- 标准化:SAML和OIDC标准化程度最高,适合跨组织集成
发展趋势
- OIDC:正在成为现代应用的标准选择
- OAuth 2.0:在API授权领域占据主导地位
- SAML:在企业级联邦身份管理中仍然重要
- CAS:在Java生态中仍有广泛应用
最佳实践
- 混合使用:根据具体场景组合使用不同协议
- 安全优先:始终将安全性放在首位
- 用户体验:在保证安全的前提下优化用户体验
- 持续改进:定期评估和优化SSO解决方案
选择合适的单点登录解决方案需要综合考虑技术、业务和安全等多个维度,希望本文能够为您的决策提供有价值的参考。