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
CAS票据层级关系图 TGT 票据授权票据 ST 服务票据 PGT 代理授权票据 签发 签发 Proxy ST(代理服务票据) 生成

4.3 CAS协议流程

CAS协议的核心流程包括登录流程、验证流程和登出流程。下面逐一拆解每个流程的详细步骤。

4.3.1 登录流程

用户首次访问受保护应用时的完整登录流程:

  1. 用户请求受保护资源:浏览器访问CAS Client保护的URL
  2. CAS Client拦截:Authentication Filter检测到用户未认证,重定向至CAS Server的登录URL,并附加service参数(目标服务地址)
  3. CAS Server展示登录页:用户输入用户名/密码(或通过其他认证方式)
  4. CAS Server认证:Authentication Handler验证凭据,成功后创建TGT,并将TGT ID写入TGC Cookie返回给浏览器
  5. 签发ST:CAS Server基于TGT生成ST,将浏览器重定向回CAS Client的service地址,URL中携带ticket=ST
  6. CAS Client接收ST:Ticket Validation Filter捕获ST,向CAS Server发起ST验证请求
  7. CAS Server验证ST:验证ST有效后,返回用户身份信息(如用户名、属性)给CAS Client
  8. CAS Client建立本地会话:创建本地Session,用户可正常访问受保护资源
CAS登录流程时序图 浏览器 CAS Client CAS Server ① 请求受保护资源 ② 重定向至登录页 ③ 请求登录页 ④ 提交凭据 ⑤ 认证成功,设置TGC ⑥ 重定向至service?ticket=ST ⑦ 携带ST请求CAS Client ⑧ 验证ST ⑨ 返回用户身份 ⑩ 建立本地会话,返回资源

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认证的应用会话都被清除:

  1. 用户发起登出:访问CAS Client的登出URL或直接访问CAS Server的/logout端点
  2. CAS Server清除TGT:销毁TGT,清除TGC Cookie
  3. CAS Server查询已认证服务:从TGT关联的Service Registry中获取所有已访问过的CAS Client列表
  4. CAS Server发送登出回调:向每个已注册的CAS Client发送HTTP POST请求,携带登出声明
  5. CAS Client处理回调:Single Sign-Out Filter接收请求,销毁对应的本地Session
  6. CAS Server返回登出确认页:通知用户已成功登出
工程陷阱:SLO的回调是异步的,CAS Server不会等待所有CAS Client确认后再返回响应。如果某个CAS Client不可达,登出事件可能丢失。生产环境建议使用消息队列(如Redis Pub/Sub)或数据库记录登出事件,确保最终一致性。
CAS单点登出流程 浏览器 CAS Client A CAS Client B CAS Server ① 请求登出 ② 清除TGT/TGC 销毁票据 ③ 查询已认证服务列表 获取Client列表 ④ 登出回调 ⑤ 登出回调 ⑥ 销毁本地Session Session失效 ⑥ 销毁本地Session Session失效

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以上版本。