CAS
协议简介
CAS 协议是一种简单而强大的基于票据的协议。完整的协议规范详见这里.
它涉及到一个或多个客户端和一个服务器。客户端嵌入在 CAS 化的应用程序中(称为“CAS 服务”),而 CAS 服务器是一个独立的组件:
- CAS server 负责用户的身份验证和对应用程序的访问授权。
- CAS clients 保护 CAS 应用程序,并从 CAS 服务器检索已授权用户的身份。
关键概念
TGT(Ticket Granting Ticket,票据授予票据),存储在TGC cookie中,代表用户的单点登录会话。ST(Service Ticket,服务票据),作为URL中的GET参数传输,代表由CAS服务器为特定用户授予CAS应用的访问权限。
版本
以下是由 Apereo CAS 认可并实现的规范版本。
3.0.3
当前的 CAS 协议规范是 3.0.3 版本。实际的协议规范详见这里, 这是由 Apereo CAS 服务器作为官方参考实现的。它主要是对 CAS 协议修订版 2.0 上最常见增强功能的捕捉。与其他功能相比,2.0 和 3.0 版本之间最显著的更新是在新的 /p3/serviceValidate 端点上返回认证/用户属性的能力。
2.0
2.0 版本的协议规范可在 这里找到.
认证流程图

对接示例
端点
对于华东师范大学,CAS 服务当前的前缀是 https://sso.ecnu.edu.cn/
平台已经实现了与学校统一身份认证系统,企业微信的集成对接,并且自动根据环境判断认证方式。因此通过授权码模式对接的应用,在浏览器上访问时,将通过统一身份认证系统认证,在微信/企业微信内打开时,则将自动通过企业微信认证。一次对接即可打通两个平台。
白名单
在对接 CAS 服务之前,您需要将您的应用程序添加到 CAS 服务的白名单中。请将您的应用程序的 应用中文名称、应用英文简称、URL 发送给我们,以便我们将其添加到白名单中。
发起认证
要发起认证,您需要将用户重定向到 CAS 服务器的 /login 端点。假定您的应用的地址是 https://apphost/callback
那么可以构造一个这样的地址给用户访问,以发起认证:
https://sso.ecnu.edu.cn/login?service=https://apphost/xxxx
获取票据
如果用户完成了身份认证,则会重定向到发起认证时指定的 service 地址,并且会在 URL 中包含一个 ticket 参数。您可以使用这个 ticket 参数来获取用户的身份信息。
例如这样子
https://apphost/xxxx?ticket=ST-21623-vAOCDsdOZ5TSN89y-s9kCTZfGkorg-sso-59c5d5fccc-fsvpx
验证票据
要验证票据,您需要将获取到的 ticekt 和 service 发送到 CAS 服务器的 /serviceValidate 端点,或者 p3/serviceValidate。端点会返回一个 XML 文档,其中包含用户的身份信息。注意您发送的 service 必须和发起认证时提供的 service 严格一致。
请求示例
3.0 版本
对于 /p3/serviceValidate 端点,您可以发送这样的请求。
GET /p3/serviceValidate?service=https://apphost/xxxx&ticket=ST-21623-vAOCDsdOZ5TSN89y-s9kCTZfGkorg-sso-59c5d5fccc-fsvpx您将得到类似这样的响应
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>20xxxx73</cas:user>
<cas:attributes>
<cas:isFromNewLogin>true</cas:isFromNewLogin>
<cas:authenticationDate>2025-08-04T12:52:17.529</cas:authenticationDate>
<cas:authnContextClass>mfa-sms</cas:authnContextClass>
<cas:successfulAuthenticationHandlers>SmsTokenAuthenticationHandler</cas:successfulAuthenticationHandlers>
<cas:ip>172.20.x.x</cas:ip>
<cas:BMBM>0445</cas:BMBM>
<cas:serviceName>xxx系统</cas:serviceName>
<cas:deviceId>d2ad6785xxxxxxxxdc61aa61</cas:deviceId>
<cas:samlAuthenticationStatementAuthMethod>urn:oasis:names:tc:SAML:1.0:am:unspecified</cas:samlAuthenticationStatementAuthMethod>
<cas:credentialType>SmsTokenCredential</cas:credentialType>
<cas:completedLoginMethod>smsLogin</cas:completedLoginMethod>
<cas:completedLoginMethod>UsernamePassword</cas:completedLoginMethod>
<cas:XM>冯*</cas:XM>
<cas:authenticationMethod>SmsTokenAuthenticationHandler</cas:authenticationMethod>
<cas:XGH>20xxxxx73</cas:XGH>
<cas:longTermAuthenticationRequestTokenUsed>false</cas:longTermAuthenticationRequestTokenUsed>
<cas:serviceId>https://xxxxxxxx*</cas:serviceId>
<cas:BMMC>信息化治理办公室</cas:BMMC>
<cas:user-agent>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0</cas:user-agent>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>响应中包含用户的身份信息,例如用户名、学号、姓名、部门等信息。
| 属性名称 | 描述 |
|---|---|
| cas:user | 用户名 |
| cas:attributes | 用户属性,包含用户的详细信息 |
| cas:XM | 姓名 |
| cas:XGH | 学号 |
| cas:BMMC | 部门名称 |
| cas:BMBM | 部门代码 |
2.0 版本
对于 /serviceValidate 端点,您可以发送这样的请求
GET /serviceValidate?service=https://apphost/xxxx&ticket=ST-21623-vAOCDsdOZ5TSN89y-s9kCTZfGkorg-sso-59c5d5fccc-fsvpx使用 sso.ecnu.edu.cn 方式将得到类似这样的响应
<cas:serviceResponse
xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>20xxxx73</cas:user>
</cas:authenticationSuccess>
</cas:serviceResponse>注销
应用注销时,可以通过访问 https://sso.ecnu.edu.cn/logout?service=https://apphost/xxxx 实现单点登录的注销。接口将自动注销 CAS 服务的会话,并重定向到期望的回调地址 service 上。