CAS2协议

CAS 协议简介

在CAS 协议中,涉及到两个主体。

  • CAS Server: CAS服务,身份认证提供方。
  • CAS Client: CAS客户端,资源提供方,如第三方应用。

这两个主体通过用户浏览器进行信息交换。方式上,比如CAS Client可以返回带参数的重定向,将信息转发给CAS Server。登录验证成功后CAS Server会返回CAS Client一个包含用户信息的XML, CAS Client验证用户信息后会返回给用户访问资源。

CAS 流程

  1. 用户试图登录CAS Client提供的应用。
  2. CAS Client会分析该请求的Http请求中是否包含认证票据ST,如果没有,则说明当前用户尚未认证,于是重定向CAS Server,并传递Service (也就是要访问的目的资源地址)。
  3. 用户输入认证信息,如果登录成功,CAS Server随机产生一个相当长度、唯一、不可伪造的票据ST,然后附带生成的ST重定向到CAS client。
  4. CAS Client在拿到Service和新产生的ST过后,通过后台与CAS Server进行交互验证。
  5. CAS Server根据请求参数Service和ST进行身份核实,以确保ST的合法性,并返回一段指定格式的XML(包含用户信息)给CAS Client。
  6. CAS Client和CAS Server之间完成了一个对用户的身份核实,返回给用户CAS Client访问资源。

CAS URIs

CAS 是一种基于 HTTP[2,3] 的协议,要求其每个组件都可以通过特定的 URI 进行访问。

/login

当/login充当凭证请求者时,可以将以下 HTTP 请求参数传递给/login。它们都区分大小写。

  1. service [OPTIONAL]- 客户端尝试访问的应用程序的标识符。在几乎所有情况下,这都是应用程序的 URL。请注意,作为 HTTP 请求参数,此 URL 值必须进行 URL 编码,如 RFC 1738 [4] 的第 2.2 节中所述。如果未指定服务并且单点登录会话尚不存在,CAS 应向用户请求凭据以启动单点登录会话。如果未指定服务并且单点登录会话已存在,CAS 应显示一条消息,通知客户端它已登录。
  2. renew [OPTIONAL]- 如果设置此参数,将绕过单点登录。在这种情况下,无论是否存在与 CAS 的单点登录会话,CAS 都将要求客户端提供凭据。该参数与“gateway”参数不兼容。重定向到/login URI 的服务和发布到/login URI 的登录表单视图不应同时设置“更新”和“网关”请求参数。如果两者都设置了,则行为未定义。如果设置了“更新”,建议 CAS 实现忽略“网关”参数。建议设置renew参数时,其值为“true”。
  3. gateway [OPTIONAL]- 如果设置此参数,CAS 将不会向客户端询问凭据。如果客户端与 CAS 之间存在预先存在的单点登录会话,或者可以通过非交互方式(即信任身份验证)建立单点登录会话,则 CAS 可以将客户端重定向到“ service”参数,附加有效的服务票证。(CAS 还可以插入一个咨询页面,通知客户端已进行 CAS 身份验证。)如果客户端没有与 CAS 的单点登录会话,并且无法建立非交互式身份验证,则 CAS 必须重定向客户端到“service”参数指定的 URL,且该 URL 中不附加“ticket”参数。如果未指定“service”参数并设置了“gateway”,则 CAS 的行为未定义。建议在这种情况下,CAS 请求凭据,就像未指定任何参数一样。该参数与“renew”参数不兼容。如果两者都设置了,则行为未定义。建议设置网关参数时其值为“true”。

示例:

https://server/cas/login?service=http%3A%2F%2Fwww.service.com

/logout

/logout销毁客户端的单点登录 CAS 会话。票证授予 cookie被销毁,后续对/login 的请求将无法获取服务票证,直到用户再次提供主凭据(从而建立新的单点登录会话)。

以下 HTTP 请求参数可以指定为/logout。它区分大小写。

  1. url [可选] - 如果指定了“url”,则“url”指定的 URL 应位于注销页面上并带有描述性文本。例如,“您刚刚注销的应用程序提供了一个希望您关注的链接。请点击此处访问http://www.go-back.edu。”

/serviceValidate [CAS 2.0]

/serviceValidate检查服务票证的有效性并返回 XML 片段响应。/serviceValidate 还必须在请求时生成并发出代理授予票证。如果 /serviceValidate 收到代理票证,则不得返回成功的身份验证。建议如果 /serviceValidate 收到代理票证,则 XML 响应中的错误消息应解释验证失败,因为代理票证已传递给/serviceValidate。

以下 HTTP 请求参数可以指定为/serviceValidate。它们区分大小写。

  1. service [REQUIRED]- 为其签发票证的服务的标识符,如第 2.2.1 节中所述。
  2. ticket [REQUIRED]- /login 发出的服务票证。服务票据在第 3.1 节中描述。
  3. pgtUrl [OPTIONAL]- 代理回调的 URL。第 2.5.4 节中讨论。
  4. renew [OPTIONAL]- 如果设置此参数,则仅当服务票证是通过用户的主要凭据的呈现发出的时,票证验证才会成功。如果票证是从单点登录会话发出的,则会失败。

/serviceValidate将返回 XML 格式的 CAS serviceResponse,如附录 A 中的 XML 架构中所述。以下是响应示例:

票证验证成功时:

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>username</cas:user>
            <cas:proxyGrantingTicket>PGTIOU-84678-8a9d...
        </cas:proxyGrantingTicket>
    </cas:authenticationSuccess>
</cas:serviceResponse>

票据验证失败时:

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationFailure code="INVALID_TICKET">
        Ticket ST-1856339-aA5Yuvrxzpv8Tau1cYQ7 not recognized
    </cas:authenticationFailure>
</cas:serviceResponse>