引言
CAS是耶魯大學發起的一個開源單點登錄項目,也是用的最為廣泛的開源項目。對于學習SSO有非常好的參考價值
什么是單點登錄
單點登錄(Single Sign On),簡稱為 SSO。多用于多系統共存的環境下,用戶在一處登錄后,就不用在其他系統中登錄,最簡單的單點登入實現可以完全基于cookie
,通過往瀏覽器寫帶有登入信息的token來達到多點登入的目的,有興趣的可以自己動手實現一個
CAS單點登入的實現
先盜個圖 :
cas單點登錄.png
從結構上看,分成了三部分:CAS Client,CAS Server,瀏覽器
CAS Client 與受保護的客戶端應用部署在一起,以 Filter 方式保護 Web 應用的受保護資源,過濾從客戶端過來的每一個Web請求
下面我將分為兩部分(用戶第一次登錄驗證和之后的登錄驗證)詳細解析其登入原理
用戶第一次登錄過程原理
-
CAS Client
會先根據JSESSIONID
(存在瀏覽器cookie中) 來判斷當前訪問用戶是否已經登錄,如果沒有JSESSIONID
會繼續分析 HTTP 請求中是否包含請求Service Ticket
( ST 上圖中的 Ticket) ,如果沒有,則說明該用戶是沒有經過認證的;于是CAS Client
會重定向用戶請求到CAS Server
,并傳遞Service
(要訪問的目的資源地址) - 這時還沒有登錄過
CAS Server
,進入用戶認證過程(返回登入界面) - 如果用戶認證成功,
CAS Server
將隨機產生一個相當長度、唯一、不可偽造的Service Ticket
,并緩存以待將來驗證,并且重定向用戶到 Service 所在地址(附帶剛才產生的 Service Ticket ) , 并為客戶端瀏覽器設置一個Ticket Granted Cookie
( TGC,該Cookie設置的是SSO Server
的域名) -
CAS Client
在拿到Service
和新產生的Ticket
過后,與CAS Server
通過拿到的Ticket
進行身份核實,以確保Service Ticket
的合法性。
以上是第一次驗證時基本流程
當第二次驗證時分兩種情況
- 同一個服務再次登錄
這里瀏覽器cookie
中會有sessionid
,憑借這個sessionid
就不再需要去CAS Server
繼續認證 - 另外一個未登錄過的服務登錄
在上面步驟中的第二歩,因為之前已經在CAS Server
登錄成功過,CAS Server
會讀取瀏覽器中的TGC
(cookie),表明已經登入過,就不需要去返回登錄界面了,直接返回CAS Client 一個唯一 票據(ticket),并進入第三歩。這樣就實現了單點登錄,多點無需再次手動登錄
關于跨域的實現
跨域的關鍵在于瀏覽器端的Cookie:TGC
,因為這個Cookie是設置在SSO Server
端的,也就保證了統一票據和Client
端域名無關。
總結
cas 單點登錄核心就是 單個cookie
, N個session
- 單個
cookie(TGC)
在cas為各應用登錄時使用,實現了只須一次錄入用戶密碼,此cookie
只于cas server
相關,這也是cas
可以實現跨域的關鍵 - N個
session
各應用會創建自己的session
表示是否登錄,如已登錄,就不會去CAS Server 去驗證TGC
在該協議中,所有與 CAS Server 的交互均采用 SSL
協議,以確保 ST
和 TGC
的安全性。