單點登錄系統的實現2

一、共享Session

        共享Session可謂是實現單點登錄最直接、最簡單的方式。將用戶認證信息保存於Session中,即以Session內存儲的值爲用戶憑證,這在單個站點內使用是很正常也很容易實現的,而在用戶驗證、用戶信息管理與業務應用分離的場景下即會遇到單點登錄的問題,在應用體系簡單,子系統很少的情況下,可以考慮採用Session共享的方法來處理這個問題。

                                                     

         基於Redis的Session共享方案。將Session存儲於Redis上,然後將整個系統的全局Cookie Domain設置於頂級域名上,這樣SessionID就能在各個子系統間共享。

         這個方案存在着嚴重的擴展性問題,首先,ASP.NET的Session存儲必須爲SessionStateItemCollection對象,而存儲的結構是經過序列化後經過加密存儲的。並且當用戶訪問應用時,他首先做的就是將存儲容器裏的所有內容全部取出,並且反序列化爲SessionStateItemCollection對象。這就決定了他具有以下約束:

  1. Session中所涉及的類型必須是子系統中共同擁有的(即程序集、類型都需要一致),這導致Session的使用受到諸多限制;
  2. 跨頂級域名的情況完全無法處理;

二、基於OpenId的單點登錄 

        這種單點登錄將用戶的身份標識信息簡化爲OpenId存放於客戶端,當用戶登錄某個子系統時,將OpenId傳送到服務端,服務端根據OpenId構造用戶驗證信息,多用於C/S與B/S相結合的系統,流程如下:

                                                     

由上圖可以看到,這套單點登錄依賴於OpenId的傳遞,其驗證的基礎在於OpenId的存儲以及發送。

  1. 當用戶第一次登錄時,將用戶名密碼發送給驗證服務;
  2. 驗證服務將用戶標識OpenId返回到客戶端;
  3. 客戶端進行存儲;
  4. 訪問子系統時,將OpenId發送到子系統;
  5. 子系統將OpenId轉發到驗證服務;
  6. 驗證服務將用戶認證信息返回給子系統;
  7. 子系統構建用戶驗證信息後將授權後的內容返回給客戶端。

這套單點登錄驗證機制的主要問題在於他基於C/S架構下將用戶的OpenId存儲於客戶端,在子系統之間發送OpenId,而B/S模式下要做到這一點就顯得較爲困難。

三、基於Cookie的OpenId存儲方案

        Cookie的作用在於充當一個信息載體在Server端和Browser端進行信息傳遞,而 Cookie 一般是以域名爲分割的,例如a.xxx.com 與 b.xxx.com 的 Cookie 是不能互相訪問的,但是子域名是可以訪問上級域名的 Cookie 的。即 a.xxx.com 和b.xxx.com 是可以訪問 xxx.com 下的 Cookie 的,於是就能將頂級域名的 Cookie 作爲 OpenId 的載體。

                                                  

驗證步驟和上第二個方法非常相似:

  1. 在提供驗證服務的站點裏登錄;
  2. 將OpenId寫入頂級域名Cookie裏;
  3. 訪問子系統(Cookie裏帶有OpenId);
  4. 子系統取出OpenId通過並向驗證服務發送OpenId;
  5. 返回用戶認證信息;
  6. 返回授權後的內容。

四、B/S多域名環境下的單點登錄處理

      在多個頂級域名的情況下,我們將無法讓各個子系統的OpenId共享。處理B/S環境下的跨域問題,我們首先就應該想到JSONP的方案。

                                      

驗證步驟如下:

  1. 用戶通過登錄子系統進行用戶登錄;
  2. 用戶登錄子系統記錄了用戶的登錄狀態、OpenId等信息;
  3. 用戶使用業務子系統;
  4. 若用戶未登錄業務子系統則將用戶跳轉至用戶登錄子系統;
  5. 用戶子系統通過JSONP接口將用戶OpenId傳給業務子系統;
  6. 業務子系統通過OpenId調用驗證服務;
  7. 驗證服務返回認證信息、業務子系統構造用戶登錄憑證;(此時用戶客戶端已經與子業務系統的驗證信息已經一一對應)
  8. 將用戶登錄結果返回用戶登錄子系統,若成功登錄則將用戶跳轉回業務子系統;
  9. 將授權後的內容返回客戶端。

轉自:dwz.cn/d90vKSJE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章