CAS實現單點登入SSO執行原理探究

yshir-phper發表於2020-11-22

1、登入資訊傳遞


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

1)、使用者瀏覽器訪問系統A需登入受限資源,此時進行登入檢查,發現未登入,然後進行獲取票據操作,發現沒有票據。

2)、系統A發現該請求需要登入,將請求重定向到認證中心,獲取全域性票據操作,沒有,進行登入。

3)、認證中心呈現登入頁面,使用者登入,登入成功後,認證中心重定向請求到系統A,並附上認證通過令牌,此時認證中心同時生成了全域性票據。

4)、此時再次進行登入檢查,發現未登入,然後再次獲取票據操作,此時可以獲得票據(令牌),系統A與認證中心通訊,驗證令牌有效,證明使用者已登入。

5)、系統A將受限資源返給使用者。
2.已登入使用者首次訪問應用群中系統B時:

1)、瀏覽器訪問另一應用B需登入受限資源,此時進行登入檢查,發現未登入,然後進行獲取票據操作,發現沒有票據。

2)、系統B發現該請求需要登入,將請求重定向到認證中心,獲取全域性票據操作,獲取全域性票據,可以獲得,認證中心發現已經登入。

3)、認證中心發放臨時票據(令牌),並攜帶該令牌重定向到系統B。

4)、此時再次進行登入檢查,發現未登入,然後再次獲取票據操作,此時可以獲得票據(令牌),系統B與認證中心通訊,驗證令牌有效,證明使用者已登入。

5)、系統B將受限資源返回給客戶端。


2、登入狀態判斷

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

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

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

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

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

整個登出流程如下:

1)、客戶端嚮應用A傳送登出Logout請求。
2)、應用A取消本地會話,同時通知認證中心,使用者已登出。
3)、應用A返回客戶端登出請求。
4)、認證中心通知所有使用者登入訪問的應用,使用者已登出。

相關文章