CAS實現單點登錄(SSO)過程淺析

英雄聯盟 軟件 科技 點融黑幫 2017-06-09

一、何謂單點登錄

單點登錄(Single Sign On),簡稱為 SSO,簡單理解就是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。

二、何謂CAS

CAS(Central Authentication Service)是耶魯大學的一個開源項目,旨在為web應用系統提供一種可靠的單點登錄解決方案。採用CAS最大的是從安全性角度來考慮的,用戶在CAS錄入用戶名和密碼之後通過ticket進行認證,不會在網上傳輸密碼,保證安全性。

三、CAS中的關鍵詞理解

ST(Service Ticket):服務票據,服務的唯一標識碼,由TGT生成ST,返回給用戶,接著拿著生成的ST去訪問service,service又會把ST拿到CAS系統去驗證,驗證通過後才允許用戶訪問該資源。

TGC( Ticket Granting Cookie):CAS系統用來識別用戶身份的憑證。

TGT(Ticket Grangting Ticket):授權票據,獲取這TGT之後才能申請服務票據 (ST),用戶如果在CAS系統認證成功之後,就會生成TGC寫入瀏覽器,同時也生成一個TGT,TGT對象的id就是cookie值。之後每次請求過來通過此cookie來從緩存獲取TGT,就不用提交身份認證信息(Credentials)。

Session:各個應用系統會創建自己的session表示是否登錄,而這裡的每個session都是ST驗證通過之後組裝生成的。

四、實現原理

假設我們現在有應用系統A、應用系統B、CAS認證系統

1、第一次訪問系統A時,沒有票據(ST),也沒有session,會重定向到CAS服務器,要求用戶輸入用戶名和密碼,之後CAS向瀏覽器寫入TGC,同時生成TGT保存到緩存,CAS服務器會根據TGT生成ST,然後CAS會重定向到給應用系統A,CAS將這個ST和成功登錄的用戶,以及服務聯繫在一起。這個ST使用次數(numberOfUses)和有效時間(timeToKill)是可配置的,超過設置的次數或者超過有效時間就會失效。

2、應用系統A收到這個ST之後,它並不知道這個用戶已經登錄成功,就通過將ST 傳遞給一個校驗URL,校驗URL拿到Cas系統去驗證,CAS通過驗證之後返回用戶信息,並且將ST作廢。

3、應用系統A根據從CAS收到的用戶信息將session創建起來,這樣我們的應用就擁有了一個自己的session。

4、第一次訪問另一個應用系統B,也是沒有票據(ST),也沒有session,會再次被重定向到CAS系統,CAS系統會去獲得TGC,如果該TGC沒有失效,則拿到TGT生成ST給用戶重定向到系統B,系統B拿到ST之後再去CAS系統驗證(同應用系統B的驗證方式),驗證成功則創建session;如果 TGC失效,那麼用戶還是要重新認證。

5、再去訪問系統A時,沒有票據,因為票據只能用一次,但是我們有session,所以不用跳轉到CAS去簽發票據了,直接允許用戶訪問。

6、用戶登出的時候,CAS系統接受請求後,會檢測用戶的TGC,把對應的session清除,同時會找到所有通過該TGC進行SSO登錄的應用服務器URL提交請求,所有的回調請求中,包含一個參數logoutRequest,內容格式如下:

<samlp:LogoutRequest ID="[RANDOMID]" Version="2.0" IssueInstant="[CURRENTDATE/TIME]">

<saml:NameID>@NOT_USED@</saml:NameID>

<samlp:SessionIndex>[SESSIONIDENTIFIER]</samlp:SessionIndex>

</samlp:LogoutRequest>

所有收到請求的應用服務器會解析這個參數,取得sessionId,根據這個Id取得session後,把session清除。

四、列舉點融網統一驗證中心後端的一個例子

現有兩個系統,一個是techops應用系統,是web界面的管理控制檯,通過techops錄入資源,角色,做權限分配。

另一個是cas系統,即我們的單點登錄系統,各個子應用系統通過cas做sso認證。

1、我在本地部署起來兩個系統之後,第一次訪問techops應用系統http://localhost:8143/techops/,此時我們沒有票據,也沒有session會重定向到CAS系統。

CAS實現單點登錄(SSO)過程淺析

CAS統一認證登錄界面如下,我們看到的鏈接是:http://localhost:8142/cas/login?service=http%3A%2F%2Flocalhost%3A8143%2Ftechops%2Flogin%2Fcas

後面加入了一個service,通過decodeURIComponent('http%3A%2F%2Flocalhost%3A8143%2Ftechops%2Flogin%2Fcas');解析之後的樣子:"http://localhost:8143/techops/login/cas",就是在用戶登錄成功之後跳轉的URL。

CAS實現單點登錄(SSO)過程淺析

2、我們輸入用戶名和密碼,登錄成功之後,會跳轉到techops系統,攜帶了一個ticket = ST-1-oYYmrbiaZ7LnFlA77rfr-cas01.dianrong.com(隨機生成),同時我們也看到了CAS向瀏覽器寫入了TGC。

techops系統界面如下:

CAS實現單點登錄(SSO)過程淺析

3、下次我們再去訪問http://localhost:8143/techops,就不會去簽發ticket了,此時techops已經根據從CAS返回的用戶信息將session創建起來,我們的session是已經有信息了,瀏覽器後臺是看不到重定向到CAS系統去驗證這些流程了。

CAS實現單點登錄(SSO)過程淺析


本文作者:鄧海波,90後IT小猿一枚,平時喜歡看看電影玩玩LOL。目前就職於點融成都分公司架構團隊,軟件開發工程師。

相關推薦

推薦中...