原創 CAS總結之Ticket篇

2021-06-13 00:35:10 字數 3001 閱讀 3704

cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt、st、pgt、pgtiou、pt,其中tgt、st是cas1.0協議中就有的票據,pgt、pgtiou、pt是cas2.0協議中有的票據。

一 名詞解釋

tgt是cas為使用者簽發的登入票據,擁有了tgt,使用者就可以證明自己在cas成功登入過。tgt封裝了cookie值以及此cookie值對應的使用者資訊。使用者在cas認證成功後,cas生成cookie,寫入瀏覽器,同時生成乙個tgt物件,放入自己的快取,tgt物件的id就是cookie的值。當http再次請求到來時,如果傳過來的有cas生成的cookie,則cas以此cookie值為key查詢快取中有無tgt ,如果有的話,則說明使用者之前登入過,如果沒有,則使用者需要重新登入。

st是cas為使用者簽發的訪問某一service的票據。使用者訪問service時,service發現使用者沒有st,則要求使用者去cas獲取st。使用者向cas發出獲取st的請求,如果使用者的請求中包含cookie,則cas會以此cookie值為key查詢快取中有無tgt,如果存在tgt,則用此tgt簽發乙個st,返回給使用者。使用者憑藉st去訪問service,service拿st去cas驗證,驗證通過後,允許使用者訪問資源。

proxy service的**憑據。使用者通過cas成功登入某一proxy service後,cas生成乙個pgt物件,快取在cas本地,同時將pgt的值(乙個uuid字串)回傳給proxy service,並儲存在proxy service裡。proxy service拿到pgt後,就可以為target service(back-end service)做**,為其申請pt。

pgtiou是cas協議中定義的一種附加票據,它增強了傳輸、獲取pgt的安全性。

pgt的傳輸與獲取的過程:proxy service呼叫cas的servicevalidate介面驗證st成功後,cas首先會訪問pgturl指向的https url,將生成的 pgt及pgtiou傳輸給proxy service,proxy service會以pgtiou為key,pgt為value,將其儲存在map中;然後cas會生成驗證st成功的xml訊息,返回給proxy service,xml訊息中含有pgtiou,proxy service收到xml訊息後,會從中解析出pgtiou的值,然後以其為key,在map中找出pgt的值,賦值給代表使用者資訊的assertion物件的pgtid,同時在map中將其刪除。

pt是使用者訪問target service(back-end service)的票據。如果使用者訪問的是乙個web應用,則web應用會要求瀏覽器提供st,瀏覽器就會用cookie去cas獲取乙個st,然後就可以訪問這個web應用了。如果使用者訪問的不是乙個web應用,而是乙個c/s結構的應用,因為c/s結構的應用得不到cookie,所以使用者不能自己去cas獲取st,而是通過訪問proxy service的介面,憑藉proxy service的pgt去獲取乙個pt,然後才能訪問到此應用。

二 **解析

cas ticket類圖

方法宣告:public synchronized serviceticket grantserviceticket(final string id,final service service, final expirationpolicy expirationpolicy, final boolean credentialsprovided)

方法描述:

1:生成serivceticketimpl

2:更新屬性:

this.previouslasttimeused = this.lasttimeused;

this.lasttimeused = system.currenttimemillis();

this.countofuses++;

3:給service物件的principal屬性賦值

4:將service物件放入map services

方法宣告:

public ticketgrantingticket grantticketgrantingticket(final string id, final authentication authentication,final expirationpolicy expirationpolicy)

方法描述:在cas3.3對cas2.0協議的實現中,pgt是由st簽發的,呼叫的就是serviceticket的grantticketgrantingticket方法。方法返回的ticketgrantingticket物件,表徵的是乙個pgt物件,其中的ticketgrantingticket屬性的值是簽發st的tgt物件。

方法宣告:void expire()

方法描述:

在cas的logout介面實現中,要呼叫tgt物件的expire方法,然後會在快取中清除此tgt物件。

expire方法的內容:迴圈遍歷 services 中的service物件,呼叫其logoutofservice方法。具體service實現類中的logoutofservice方法的實現,要通知具體的應用,客戶要退出。

tgt、st、pgt、pt之間關係的總結

1:st是tgt簽發的。使用者在cas上認證成功後,cas生成tgt,用tgt簽發乙個st,st的ticketgrantingticket屬性值是tgt物件,然後把st的值redirect到客戶應用。

2:pgt是st簽發的。使用者憑藉st去訪問proxy service,proxy service去cas驗證st(同時傳遞pgturl引數給cas),如果st驗證成功,則cas用st簽發乙個pgt,pgt物件裡的ticketgrantingticket是簽發st的tgt物件。

3:pt是pgt簽發的。proxy service**back-end service去cas獲取pt的時候,cas根據傳來的pgt引數,獲取到pgt物件,然後呼叫其grantserviceticket方法,生成乙個pt物件。

tgt、st、pgt、pt之間的關聯關係

注:如果本文中介紹的 ticket 概念不詳細,請參考本人的另一篇文章 cas 總結之協議分析篇,裡面的動畫演示比較清楚地表達了 client 、 service 、 cas 三者之間的互動。

CAS總結之Ticket篇

器 webxml cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt st pgt pgtiou pt,其中tgt st是cas1.0協議中就有的票據,pgt pgtiou pt是cas2.0協議中有的票據。一 名詞解釋 tgt是cas為使用者簽發的登入...

CAS總結之Ticket篇

cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt st pgt pgtiou pt,其中tgt st是cas1.0協議中就有的票據,pgt pgtiou pt是cas2.0協議中有的票據。一 名詞解釋 tgt ticket grangting tick...

原創 總結 WCF技術剖析系列總結篇

近半年以來,一直忙於我的第一本wcf專著 wcf技術剖析 的寫作,一直無暇管理自己的blog。到目前為止 wcf技術剖析 卷1 的寫作暫告一段落,初步預計於下個月由武漢博文視點出版。在 wcf技術剖析 寫作期間,對wcf又有了新的感悟,為此以書名開始本人的第三個wcf系列。本系列的目的在於對 wcf...