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/
,或者 https://portal1.ecnu.edu.cn/cas/
(兼容端点),目前两者都可以使用,并保持相同的协议。对于新接入的应用而言,我们建议您使用 https://sso.ecnu.edu.cn/
作为 CAS
的接入端点。
以下讲以 https://sso.ecnu.edu.cn/
作为示例,如果您使用的是 https://portal1.ecnu.edu.cn/cas/
,只需要将 sso.ecnu.edu.cn
替换为 portal1.ecnu.edu.cn/cas
即可。
白名单
在对接 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
严格一致。
请求示例
对于 /p3/serviceValidate
端点(若使用portal1.ecnu.edu.cn/cas对接,则端点为:/cas/p3/serviceValidate),您可以发送这样的请求。
GET /p3/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:attributes>
<cas:tgt>TGT-6643-K-7KbXCBpyc7SczJV99qmYiVyQRqGjNNjas61wey9X-ZGWKYuNQ786KyFrSvz3quCuUrg-sso-59c5d5fccc-fsvpxobjectId=64c8abf09ae6290001326dd1</cas:tgt>
<cas:samlAuthenticationStatementAuthMethod>urn:oasis:names:tc:SAML:1.0:am:password</cas:samlAuthenticationStatementAuthMethod>
<cas:credentialType>UsernamePasswordCredential</cas:credentialType>
<cas:completedLoginMethod>UsernamePassword</cas:completedLoginMethod>
<cas:isFromNewLogin>false</cas:isFromNewLogin>
<cas:authenticationDate>2024-07-24T13:39:15.290</cas:authenticationDate>
<cas:authenticationMethod>MultiIdPasswordAuthenticationHandler</cas:authenticationMethod>
<cas:successfulAuthenticationHandlers>MultiIdPasswordAuthenticationHandler</cas:successfulAuthenticationHandlers>
<cas:longTermAuthenticationRequestTokenUsed>false</cas:longTermAuthenticationRequestTokenUsed>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
使用 portal1.ecnu.edu.cn/cas
方式将得到类似这样的响应
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>82****25</cas:user>
<cas:attributes>
<cas:PSN_ACCOUNT>82****25</cas:PSN_ACCOUNT>
<cas:IS_ACTIVE>1</cas:IS_ACTIVE>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
对于 /serviceValidate
端点(若使用portal1.ecnu.edu.cn/cas对接,则端点为:/cas/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>
使用 portal1.ecnu.edu.cn/cas
方式将得到类似这样的响应
<?xml version='1.0' encoding='UTF-8'?>
<sso:serviceResponse xmlns:sso='http://www.yale.edu/tp/cas' xmlns:cas='http://www.yale.edu/tp/cas'>
<sso:authenticationSuccess>
<sso:user>82***25</sso:user>
<cas:attributes>
<cas:PSN_ACCOUNT>82***25</cas:PSN_ACCOUNT>
<cas:IS_ACTIVE>1</cas:IS_ACTIVE>
<cas:checkAliveTicket>TGT-10744-0w--nYEYCpP4SXWzzzBQpzXJ34cdf7ObbrgF-dRQv08P7W-7A0OVMTPUfzvqjKBqnU8rg-sso-59c5d5fccc-b4b9sobjectId=6560204c749a4500063b95a8</cas:checkAliveTicket>
<cas:serviceId>1721883987183327985</cas:serviceId>
</cas:attributes>
<sso:attributes>
<sso:attribute name="psn_account" type="java.lang.String" value="82***25"></sso:attribute>
<sso:attribute name="is_active" type="java.lang.String" value="1"></sso:attribute>
</sso:attributes>
</sso:authenticationSuccess>
</sso:serviceResponse>
注销
应用注销时,可以通过访问 https://sso.ecnu.edu.cn/logout?service=https://apphost/xxxx
实现单点登录的注销。接口将自动注销 CAS
服务的会话,并重定向到期望的回调地址 service
上。