Skip to content

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.03.0 版本之间最显著的更新是在新的 /p3/serviceValidate 端点上返回认证/用户属性的能力。

2.0

2.0 版本的协议规范可在 这里找到.

认证流程图

CAS Web flow diagram

对接示例

端点

对于华东师范大学,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

验证票据

要验证票据,您需要将获取到的 ticektservice 发送到 CAS 服务器的 /serviceValidate 端点,或者 p3/serviceValidate。端点会返回一个 XML 文档,其中包含用户的身份信息。注意您发送的 service 必须和发起认证时提供的 service 严格一致。

请求示例

对于 /p3/serviceValidate 端点(若使用portal1.ecnu.edu.cn/cas对接,则端点为:/cas/p3/serviceValidate),您可以发送这样的请求。

http
GET /p3/serviceValidate?service=https://apphost/xxxx&ticket=ST-21623-vAOCDsdOZ5TSN89y-s9kCTZfGkorg-sso-59c5d5fccc-fsvpx

使用 sso.ecnu.edu.cn 方式将得到类似这样的响应

xml
<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 方式将得到类似这样的响应

xml
<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),您可以发送这样的请求

http
GET /serviceValidate?service=https://apphost/xxxx&ticket=ST-21623-vAOCDsdOZ5TSN89y-s9kCTZfGkorg-sso-59c5d5fccc-fsvpx

使用 sso.ecnu.edu.cn 方式将得到类似这样的响应

xml
<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
<?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 上。