CAS實現SSO 單點登入

2022-08-18 16:36:15 字數 2944 閱讀 5814

cas分為兩部分,cas server和cas client

假設我們現在有應用系統a、應用系統b、cas認證系統

首先,我們來分析下單web應用系統登入登出的實現機理。web系統登入登出功能,通常屬於系統安全管理模組的一部分。如上篇所說,登入,意味著使用者與系統之間的一次會話開始,登出,意味著本次會話的結束。

下圖列出整個登入登出會話過程中,使用者與系統之間的http互動過程:

如圖,伺服器內部又做了哪些工作呢?

通常服務端在使用者登入請求到來時(圈1),會先做認證(authentication)操作,就是證明這個瀏覽器請求使用者是合法系統使用者,一般情況就是驗證使用者名稱和密碼。

認證通過後,系統緊接著給這個合法使用者授權(authorization),就是根據該使用者在此系統中的許可權定義,繫結正確的許可權資訊,為使用者後續正確使用系統功能提供安全保障。

最後建立會話,這個可以基於伺服器容器提供的session機制或自己基於cookie開發的類似功能,建立起本次會話。

登入成功後,當瀏覽器後續請求來時(圈2),伺服器需進行登入狀態判斷,即判別是否處於會話狀態,從而識別操作是否是本次登入使用者的操作。

登出時,服務端取消會話,本次登入使用者會話結束。下次請求時,系統即判斷是非登入使用者。

上面分析了單web應用登入登出實現機理。那對於多系統的sso,該如何實現呢?我們先分析下基本實現思路。

有上面分析可知,單web應用登入,主要涉及到認證、授權、會話建立、取消會話等幾個關鍵環節。推廣到多系統,每個系統也會涉及到認證、授權、會話建立取消等工作。那我們能不能把每個系統的認證工作抽象出來,放到單獨的服務應用中取處理,是不是就能解決單點登入問題?

思考方向是正確的,我們把這個統一處理認證服務的應用叫認證中心。當使用者訪問子系統需要登入時,我們把它引到認證中心,讓使用者到認證中心去登入認證,認證通過後返回並告知系統使用者已登入。當使用者再訪問另一系統應用時,我們同樣引導到認證中心,發現已經登入過,即返回並告知該使用者已登入

由上圖可以看出,原先在各系統中的認證模組,已經剝離出來放到獨立的認證中心中去執行。至於授權,每個應用都不一樣,可維持原樣。會話部分,其實分解成了全域性會話和區域性會話,這個後面再詳細解釋。

思路是有了,但真正實現這一認證伺服器我們還得要具體解決幾個關鍵問題

一、登入資訊傳遞問題

應用系統將登入請求轉給認證中心,這個很好解決,我們乙個http重定向即可實現。現在的問題是,使用者在認證中心登入後,認證中心如何將訊息轉回給該系統?

這是在單web系統中不存在的問題。我們知道http協議傳遞訊息只能通過請求引數方式或cookie方式,cookie跨域問題不能解決,我們只能通過url請求引數。

我們可以將認證通過訊息做成乙個令牌(token)再利用http重定向傳遞給應用系統。但現在的關鍵是:該系統如何判斷這個令牌的真偽?如果判斷這個令牌確實是由認證中心發出的,且是有效的?

我們還需要應用系統和認證中心之間再來個直接通訊,來驗證這個令牌確實是認證中心發出的,且是有效的。由於應用系統和認證中心是屬於服務端之間的通訊,不經過使用者瀏覽器,相對是安全的。

使用者首次登入時流程如下:

1.使用者瀏覽器訪問系統a需登入受限資源。

2.系統a發現該請求需要登入,將請求重定向到認證中心,進行登入。

3.認證中心呈現登入頁面,使用者登入,登入成功後,認證中心重定向請求到系統a,並附上認證通過令牌。

4.系統a與認證中心通訊,驗證令牌有效,證明使用者已登入。

5.系統a將受限資源返給使用者。

已登入使用者首次訪問應用群中系統b時:

瀏覽器訪問另一應用b需登入受限資源。

系統b發現該請求需要登入,將請求重定向到認證中心,進行登入。

認證中心發現已經登入,即重定向請求響應到系統b,附帶上認證令牌。

系統b與認證中心通訊,驗證令牌有效,證明使用者已登入。

系統b將受限資源返回給客戶端。

二、登入狀態判斷問題

使用者到認證中心登入後,使用者和認證中心之間建立起了會話,我們把這個會話稱為全域性會話。當使用者後續訪問系統應用時,我們不可能每次應用請求都到認證中心去判定是否登入,這樣效率非常低下,這也是單web應用不需要考慮的。

我們可以在系統應用和使用者瀏覽器之間建立起區域性會話,區域性會話保持了客戶端與該系統應用的登入狀態,區域性會話依附於全域性會話存在,全域性會話消失,區域性會話必須消失。

使用者訪問應用時,首先判斷區域性會話是否存在,如存在,即認為是登入狀態,無需再到認證中心去判斷。如不存在,就重定向到認證中心判斷全域性會話是否存在,如存在,按1提到的方式通知該應用,該應用與客戶端就建立起它們之間區域性會話,下次請求該應用,就不去認證中心驗證了。

三、登出問題

使用者在乙個系統登出了,訪問其它子系統,也應該是登出狀態。要想做到這一點,應用除結束本地區域性會話外,還應該通知認證中心該使用者登出。

認證中心接到登出通知,即可結束全域性會話,同時需要通知所有已建立區域性會話的子系統,將它們的區域性會話銷毀。這樣,使用者訪問其它應用時,都顯示已登出狀態。

整個登出流程如下:

1.客戶端向應用a傳送登出logout請求。

2.應用a取消本地會話,同時通知認證中心,使用者已登出。

3.應用a返回客戶端登出請求。

4.認證中心通知所有使用者登入訪問的應用,使用者已登出。

CAS實現SSO單點登入詳解

一.基本概念 1.sso 單點登入 single sign on 是目前比較流行的服務於企業多系統整合的解決方案之一,使得在多個系統中,使用者只需要登入 退出一次就可以訪問 退出所有相互信任的應用系統。2.cas 認證中心 central authentication service 是sso的一種...

cas單點登入 SSO 的實現原理

單點登入sso single sign on 說得簡單點就是在乙個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。單點登入在大型 裡使用得非常頻繁,例如像阿里巴巴這樣的 在 的背後是成百上千的子系統,使用者一次操作或交易可能涉及到幾十個...

SSO 單點登入CAS與OAuth2

在系統開發初期,系統很少,每個系統都有自己的登入模組,使用者直接使用自己的賬號進行登入即可。但當功能不斷完善,為了合理利用資源並降低耦合性,往往需要將單系統拆分為多個子系統。以阿里系的 為例,乙個 背後有眾多的子系統,使用者的一次交易或操作往往可能需要十多甚至幾十個子系統的協作,如果每個子系統都需要...