[轉]單點登陸SSO學習——CAS協議內容

做者:anmalerhtml

本文轉自:http://blog.zhaojunling.me/p/24git

CAS中文文檔甚少,這篇文章對CAS接口參數有比較清楚的說明,排版也不錯查閱溫馨github

 

在當前互聯網產品中使用單點登陸的狀況很是的常見,好比Google、百度、阿里雲、京東、淘寶等。在用戶中心登錄後再訪問其餘子系統時系統自動檢測已登陸狀態,而不用從新登陸。web

提及單點登陸就不得不說CAS,這個已經成爲了單點登陸的代名詞。後端

什麼是CAS?

CAS是爲了解決單點登陸問題所設計的一套協議。協議地址http://jasig.github.io/cas/development/protocol/CAS-Protocol-Specification.html瀏覽器

邏輯流程圖

借用官網的圖片:安全

上面是一般使用的單點登陸邏輯圖,代理模式的邏輯圖點這裏查看服務器

CAS相關URI

/login 負責憑證管理,即用戶統一登陸入口,1.0版本提供
/logout 退出的統一入口,1.0版本提供
/validate 服務憑證驗證,1.0版本提供,不支持proxy,返回文本字符串yes or no
/serviceValidate 同/validate,2.0版本提供,proxy tickets不能返回驗證成功的結果,返回xml字符串
/proxyValidate 同/serviceValidate,2.0版本提供,並提供對proxy tickets的驗證,返回xml字符串
/proxy 2.0版本提供,負責提供proxy tickets
/p3/serviceValidate 同/serviceValidate,3.0版本提供,返回的xml結果添加了用戶屬性字段
/p3/proxyValidate 同/p3/serviceValidate,3.0版本提供,增長對proxy tickets的驗證

能夠看出,從2.0開始驗證結果改爲了xml的格式方便擴展,在3.0中增長了用戶屬性。cookie

/login

功能描述: 負責顯示登陸頁、處理用戶登陸、生成登陸憑據。post

參數說明:

service    :可選,訪問受保護地址的標識符,基本都是一個web的URL,須要作URLEncode編碼。若是不提供則登陸成功後CAS服務器應該顯示一個信息告訴用戶已登陸。

renew     :可選,忽略已經存在的已登陸憑證,要求用戶進行登陸。不能和gateway同時使用。

gateway :可選,若是未登陸,則不顯示登陸頁面,直接跳轉到service的地址,並添加noticket參數在URL的末尾。不能和renew同時使用。

method  :可選,3.0新增,使用POST的方式發送相應的請求,默認使用302跳轉。

請求例子

https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice

Don’t prompt for username/password:

https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice&gateway=true

Always prompt for username/password:

https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice&renew=true

Use POST responses instead of redirects:

https://cas.example.org/cas/login?method=POST&service=http%3A%2F%2Fwww.example.org%2Fservice

後臺邏輯

登陸成功:重定向用戶到service所提供的URL,並添加參數名爲ticket的的service ticket。

登陸失敗:在登陸頁顯示登陸失敗的緣由。

/logout

功能描述: 銷燬以保存的已登陸憑據。

參數說明:

service    :可選,登出成功後跳轉的URL地址。

後臺邏輯

若是cas server支持SLO,則發送一個POST請求的logout格式xml到全部的cas client,若是cas client不支持則直接忽略這個請求。cas server應該忽略全部發送給cas client的異常狀況,以保證cas server的穩定性和可用性。若是cas client支持基於service ticket的SLO,則應該返回一個success的HTTP狀態碼。

/validate

功能描述:驗證service ticket的有效性,返回文本格式。

參數說明:

service    :必選,驗證成功後跳轉的URL地址。

ticket      :必選,已獲取到的service ticket值。

renew     :可選,若是設置則只有當service ticket是用戶直接登陸獲取時才返回成功,對以前已經存在的憑據無效。

接口響應內容

驗證成功:yes

驗證結果:no

/serviceValidate

功能描述:驗證service ticket的有效性,返回xml格式的結果。

參數說明:

service    :必選,驗證成功後跳轉的URL地址。

ticket      :必選,已獲取到的service ticket值。

renew     :可選,若是設置則只有當service ticket是用戶直接登陸獲取時才返回成功,對以前已經存在的憑據無效。

pgtUrl    :可選,proxy callback時的URL,在代理流程時候使用。

接口響應內容

驗證成功:

<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>

錯誤代碼:

INVALID_REQUEST   缺乏必須參數。
INVALID_TICKET_SPEC 不知足驗證規範的要求。
UNAUTHORIZED_SERVICE_PROXY 未被受權的service。
INVALID_PROXY_CALLBACK 無效的proxy callback。
INVALID_TICKET 無效的ticket,若是設置了renew且ticket不是來自初始登陸則也會被標識爲無效。
INVALID_SERVICE ticket有效,可是相關聯的service和當前提供的不匹配,CAS Server須要是銷燬當前的ticket並保證一個ticket只會使用一次。
INTERNAL_ERROR  CAS server的內部服務器錯誤。

 另:若是此接口收到的ticket是一個proxy ticket,則不能返回成功的驗證結果,應該在驗證失敗的文本消息中明確提示,如「驗證失敗,收到的是proxy ticket」。            

/proxyValidate 

功能描述: 參考/serviceValidate,添加了對proxy tickets的驗證支持。

接口相應內容

<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:proxies>

        <cas:proxy>https://proxy2/pgtUrl</cas:proxy>

        <cas:proxy>https://proxy1/pgtUrl</cas:proxy>

      </cas:proxies>

    </cas:authenticationSuccess> 

</cas:serviceResponse>

/proxy 

功能描述: 根據以前產生的PGT,獲取prox service ticker供/proxyValidate接口交互使用。                          

參數說明:

pgt                 :必選,在/serviceValidate接口中cas server生成的PGT。

targetService :必選,後端server的地址,須要和下一步驗證的/proxyValidate中service相同。

接口相應內容

<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">

      <cas:proxySuccess>

          <cas:proxyTicket>PT-1856392-b98xZrQN4p90ASrw96c8</cas:proxyTicket>

      </cas:proxySuccess>

</cas:serviceResponse>

/p3/serviceValidate 

功能描述: 同/serviceValidate,返回xml中增長了user信息的屬性。

/p3/proxyValidate

功能描述: 同/p3/serviceValidate,增長了對proxy tickets驗證的支持。

CAS中涉及的實體說明

service ticket:一個不易被預測的字符串,可做爲用戶訪問service的憑證。

相關要注意的地方

  • 在登陸的接口邏輯中生成,提供的service值不要出如今ticket中。

  • 使用一次後應該當即失效不論是否驗證成功,再此使用相同的ticket驗證時必須返回驗證失敗。

  • 應該設置一個合理的有效期,使用過時的ticket驗證必須返回驗證失敗。

  • 建議驗證失敗時返回驗證失敗的具體緣由信息。

  • 建議設置的有效期時間不超過5分鐘。

  • 必須包含一段隨機字符串,以保證不會被猜想到。

  • 必須使用ST-爲字符串開頭。

  • 必須支持保護32個以上的字符,建議支持到256個字符串的長度。

     

proxy ticket:一個不易被預測的字符串,可做爲訪問後端service的憑證。

相關要注意的地方

  • 在/proxy接口中生成,提供的service值不要出如今proxy ticket中。

  • 使用一次後應該當即失效不論是否驗證成功,再此使用相同的ticket驗證時必須返回驗證失敗。

  • 應該設置一個合理的有效期,使用過時的ticket驗證必須返回驗證失敗。

  • 建議驗證失敗時返回驗證失敗的具體緣由信息。

  • 建議設置的有效期時間不超過5分鐘。

  • 必須包含一段隨機字符串,以保證不會被猜想到。

  • 必須使用PT-爲字符串開頭。

  • 後臺service必須能接收至少32位長度的字符串的ticket。

  • 建議支持到256個長度字符串的ticket。

     

proxy-granting ticket:一個不易被預測的字符串,驗證service ticket後生成,可用於獲取proxy ticket。

相關要注意的地方

  • 可用於獲取多個proxy ticket,可屢次數使用而不失效。

  • 當用戶從CAS退出時,此ticket必須失效。

  • 必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。

  • 應該使用PGT-爲字符串開頭。

  • 須要能夠處理超過64位長度的數據。

  • 建議支持到256個長度字符串的數據。

 

proxy-granting ticket IOU:在/serviceValidate和/proxyValidate接口中返回的一段字符串,用來關聯service ticket (或proxy ticket)和proxy-granting ticket。

相關要注意的地方

  • 不該該包含任何與之有關聯的PGT信息,必須確認不能從給定的PGTIOU字符串推算出PGT。

  • 必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。

  • 應該使用PGTIOU-爲字符串開頭。

  • 必須支持保護32個以上的字符,建議支持到256個字符串的長度。

     

login ticket:和用戶名密碼一塊兒提交到後臺,爲了防止瀏覽器重複提交而形成的重複生成已登陸憑證。

相關要注意的地方

  • 必須儘量的惟一

  • 必須是一次性有效的,無論登陸成功或者失敗。

  • 應該使用LT-爲字符串開頭。

     

ticket-granting cookie: 用於確認已登陸狀態的標識,保存在用戶的瀏覽器cookie中。

相關要注意的地方

  • 若是未設置Long-Term支持,則過時時間應該設置爲當前瀏覽器的回話時間。

  • 最好設置儘量嚴格的路徑,好比cas server部署到/cas則cookie的path應最好設置爲/cas。

  • 儘可能包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。

  • 應該使用TGC-做爲cookie名稱開頭。

  • cookie的值應該和ticket-granting ticket使用相同的規則生成,一般直接使用ticket-granting ticket的值。

     

ticket and ticket-granting cookie 內容格式

全部的ticket以及ticket-granting cookie僅能包含以下字符:a-z、A-Z、0-九、-(連字符號)。

 

ticket-granting ticket: 在cas server成功登錄後生成的字符串,能夠和標識單點登陸狀態的ticket-granting cookie綁定,在必定時間內做爲基礎生成service tickets, proxy-granting tickets 等。

相關要注意的地方

  • 能夠用於獲取多個service tickets,不是一次性失效的,有過時時間和安全策略。

  • 登出cas的時候必須過時失效。

  • 必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。

  • 應該使用TGT-做爲字符串開頭。

  • 當分享給外部資源使用時推薦進行加密,以減小安全漏洞避免泄漏與之關聯了的身份認證回話。

相關文章
相關標籤/搜索