4. CAS协议详解
CAS(Central Authentication Service)是耶鲁大学发起并广泛使用的开源单点登录协议,也是目前企业级SSO落地中最成熟的协议之一。本章从架构组件、票据类型、核心流程三个维度深度解析CAS协议,帮助你在工程落地时准确理解其设计原理与边界。
4.1 CAS架构组件
CAS协议采用经典的客户端-服务器架构,由三个核心角色组成:
| 组件 | 角色 | 核心职责 | 部署形态 |
|---|---|---|---|
| CAS Server | 认证中心 | 用户身份认证、票据签发与校验、单点登出广播 | 独立Web应用集群 |
| CAS Client | 受保护应用 | 拦截未认证请求、重定向至CAS Server、验证Service Ticket | 嵌入各业务应用的Filter/Filter链 |
| User Agent | 浏览器/客户端 | 携带Cookie、发起重定向、维护会话状态 | 无状态HTTP客户端 |
架构要点:CAS Server是整个SSO体系的信任锚点,所有票据的签发与验证都必须经过CAS Server。CAS Client不直接参与用户认证,仅负责拦截请求并与CAS Server交互完成票据验证。
4.1.1 CAS Server内部组件
CAS Server内部由以下关键模块构成:
- Authentication Handler:认证处理器,支持LDAP、JDBC、OAuth、SAML等多种认证源
- Ticket Registry:票据注册中心,管理TGT、ST、PGT等票据的生命周期
- Service Registry:服务注册中心,维护已注册的CAS Client白名单与策略
- Logout Manager:登出管理器,负责单点登出事件的广播与回调
- Ticket Granting Cookie (TGC) Manager:管理TGC的签发、加密与过期
4.1.2 CAS Client内部组件
CAS Client通常以Filter形式嵌入业务应用,核心组件包括:
- Authentication Filter:拦截所有受保护请求,检查用户是否已认证
- Ticket Validation Filter:接收CAS Server返回的ST,向CAS Server发起验证请求
- Single Sign-Out Filter:监听CAS Server的登出回调,清理本地会话
- HttpServletRequest Wrapper:包装请求对象,提供获取用户身份信息的统一接口
工程建议:CAS Client的Filter顺序至关重要。通常Authentication Filter应置于最外层,Ticket Validation Filter紧随其后,Single Sign-Out Filter应优先于业务Filter执行,以确保登出事件第一时间被处理。
4.2 CAS票据类型
CAS协议定义了三种核心票据类型,每种票据都有明确的用途、生命周期和存储位置:
| 票据类型 | 全称 | 用途 | 生命周期 | 存储位置 |
|---|---|---|---|---|
| TGT | Ticket Granting Ticket | 证明用户已在CAS Server完成认证,用于签发ST | 会话期间(通常与TGC绑定) | CAS Server内存/Redis |
| ST | Service Ticket | 授权用户访问特定CAS Client服务的临时凭证 | 单次使用,通常5分钟内过期 | CAS Server + 浏览器URL参数 |
| PGT | Proxy Granting Ticket | 允许代理服务代表用户获取其他服务的ST | 与TGT生命周期一致 | CAS Server |
安全注意:ST必须设计为一次性使用票据。CAS Server在验证ST后应立即将其标记为已使用,防止重放攻击。生产环境中ST的默认过期时间建议设置为30秒至5分钟,过长会增加安全风险。
4.2.1 票据间关系
三种票据之间存在明确的层级关系:
- TGT → ST:用户持有TGT后,可向CAS Server请求任意已注册服务的ST
- TGT → PGT:当CAS Client需要代理访问其他服务时,CAS Server基于TGT签发PGT
- PGT → Proxy ST:持有PGT的代理服务可向CAS Server请求目标服务的代理ST
4.3 CAS协议流程
CAS协议的核心流程包括登录流程、验证流程和登出流程。下面逐一拆解每个流程的详细步骤。
4.3.1 登录流程
用户首次访问受保护应用时的完整登录流程:
- 用户请求受保护资源:浏览器访问CAS Client保护的URL
- CAS Client拦截:Authentication Filter检测到用户未认证,重定向至CAS Server的登录URL,并附加service参数(目标服务地址)
- CAS Server展示登录页:用户输入用户名/密码(或通过其他认证方式)
- CAS Server认证:Authentication Handler验证凭据,成功后创建TGT,并将TGT ID写入TGC Cookie返回给浏览器
- 签发ST:CAS Server基于TGT生成ST,将浏览器重定向回CAS Client的service地址,URL中携带ticket=ST
- CAS Client接收ST:Ticket Validation Filter捕获ST,向CAS Server发起ST验证请求
- CAS Server验证ST:验证ST有效后,返回用户身份信息(如用户名、属性)给CAS Client
- CAS Client建立本地会话:创建本地Session,用户可正常访问受保护资源
4.3.2 验证流程
ST验证是CAS协议中安全性的关键环节,CAS Client必须通过后端通道(back-channel)直接与CAS Server通信完成验证,而非依赖前端传递的结果:
| 验证方式 | 通信方式 | 安全性 | 适用场景 |
|---|---|---|---|
| Front-channel | 浏览器302重定向 | 低(ST暴露在URL中) | 仅用于ST传递,不用于验证 |
| Back-channel | CAS Client → CAS Server 直接HTTP请求 | 高(服务端到服务端) | ST验证、用户身份获取 |
验证协议格式:CAS Client向CAS Server的
/serviceValidate端点发送GET请求,参数包括service(目标服务URL)和ticket(ST值)。CAS Server返回XML格式的认证响应,包含<cas:authenticationSuccess>或<cas:authenticationFailure>节点。
// CAS Client验证ST的典型请求
GET /serviceValidate?service=https://app.example.com/portal&ticket=ST-12345-abcdef HTTP/1.1
Host: cas.example.com
// 验证成功响应
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>zhangsan</cas:user>
<cas:attributes>
<cas:email>zhangsan@example.com</cas:email>
<cas:department>Engineering</cas:department>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
4.3.3 登出流程
CAS的单点登出(Single Log Out, SLO)确保用户在一个应用登出后,所有通过同一CAS Server认证的应用会话都被清除:
- 用户发起登出:访问CAS Client的登出URL或直接访问CAS Server的/logout端点
- CAS Server清除TGT:销毁TGT,清除TGC Cookie
- CAS Server查询已认证服务:从TGT关联的Service Registry中获取所有已访问过的CAS Client列表
- CAS Server发送登出回调:向每个已注册的CAS Client发送HTTP POST请求,携带登出声明
- CAS Client处理回调:Single Sign-Out Filter接收请求,销毁对应的本地Session
- CAS Server返回登出确认页:通知用户已成功登出
工程陷阱:SLO的回调是异步的,CAS Server不会等待所有CAS Client确认后再返回响应。如果某个CAS Client不可达,登出事件可能丢失。生产环境建议使用消息队列(如Redis Pub/Sub)或数据库记录登出事件,确保最终一致性。
4.4 CAS协议关键设计要点
| 设计要点 | 说明 | 工程影响 |
|---|---|---|
| ST一次性使用 | ST验证后立即失效,防止重放攻击 | CAS Client必须确保每次验证都使用新的ST |
| TGC安全传输 | TGC必须设置Secure、HttpOnly、SameSite属性 | 生产环境必须启用HTTPS,防止Cookie劫持 |
| Service参数校验 | CAS Server必须校验service参数是否在注册列表中 | 防止开放重定向漏洞,所有CAS Client必须提前注册 |
| 登出回调可靠性 | SLO回调采用异步方式,不保证100%送达 | 关键业务建议增加心跳检测或补偿机制 |
| 票据超时策略 | TGT默认8小时,ST默认5分钟,PGT与TGT一致 | 根据安全等级调整超时时间,金融场景建议缩短 |
协议版本说明:目前主流使用的是CAS 3.x协议。CAS 3.0引入了代理认证(Proxy Authentication)和属性发布(Attribute Release)机制,CAS 3.5.2+增加了OAuth 2.0和OpenID Connect的桥接支持。如果你的业务需要与第三方系统集成,建议直接使用CAS 3.5.2以上版本。