SSO(單點登錄)實現機制講解

引言

         單點登錄有許多開發商提供解決方案,本文以yale大學SSO開源項目CAS爲例,介紹單點登錄實現機制。

術語解釋

SSO-Single Sign On,單點登錄

TGT-Ticket Granting Ticket,用戶身份認證憑證票據

ST-Service Ticket,服務許可憑證票據

TGC-Ticket Granting Cookie,存放用戶身份認證憑證票據的cookie

SSO原理概述

SSO組件主要包含:SSO服務器、SSO客戶端。SSO服務器主要負責完成用戶認證、提供單點登錄服務;SSO客戶端部署在應用系統(Web應用端與C/S架構模式應用端),用戶請求訪問應用系統的受保護資源時,需要將請求轉向SSO服務器進行身份認證、單點登錄服務相關處理。

 

SSO服務器接口

uri 說明
/login

憑證請求器,參數如下:

service:客戶端要訪問的應用的標識;

renew:如果設置這個參數,sso將被繞過;不支持renew和gateway同時存在,若存在則忽略gateway;

gateway:如果設置這個參數,CAS將不再問客戶端要憑證。 


憑證接收器,參數如下:

service:客戶端要訪問的應用的標識;CAS在認證成功後將它的url轉發給客戶端;

warn:在認證轉發給其他服務前,客戶端必須給予提示。

/logout 單點退出,釋放cas單點登錄的session
/proxyValidate SSO服務器驗證票據的合法性
   
   

SSO單點登錄主要原理

SSO單點登錄訪問流程主要有以下步驟:

1. 訪問服務:SSO客戶端發送請求訪問應用系統提供的服務資源。

2. 定向認證:SSO客戶端會重定向用戶請求到SSO服務器。

3. 用戶認證:用戶身份認證。

4. 發放票據:SSO服務器會產生一個隨機的Service Ticket。

5. 驗證票據:SSO服務器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務。

6. 傳輸用戶信息:SSO服務器驗證票據通過後,傳輸用戶認證結果信息給客戶端。

7. 單點退出:用戶退出單點登錄。

SSO單點登錄訪問總共會涉及以上6個步驟,但用戶不同的SSO訪問可能只會涉及到幾個步驟,我們把SSO訪問流程我們分爲5種實例情況介紹:登錄點首次訪問、登錄點二次訪問、單點首次訪問、單點二次訪問、單點退出。這5種實例應當可以比較全面地展示SSO訪問實現的機制。

注:文中存在以下術語詞彙,解釋如下。

登錄點:首次進入子系統登錄的站點在本文中稱爲登錄點。

單點:用戶已經登錄,而後再訪問另一子系統的站點在本文中稱爲單點。

登錄點首次訪問:是指首次訪問應用系統,進入登錄頁面的過程。登錄點二次訪問:是指在上述”登錄點“,再次進行正常的訪問”登錄點“的過程。

單點首次訪問:是指已經在上述“登錄點”登錄後,再首次訪問另一個子系統進行訪問的過程。單點二次訪問:是指已經在上述“單點首次訪問",再次進行正常的訪問”單點“的過程。

 

登錄點首次訪問

說明:用戶首次訪問”登錄點“System1,session中沒有用戶上下文,於是將請求地址包裝爲service參數,轉向SSO服務器”定向認證“,SSO服務器返回登錄頁面,用戶錄入用戶名、密碼等憑證信息,提交給SSO服務器,SSO服務器進行認證,認證成功後,生成TGT,再根據TGT發放票據ST,返回響應給瀏覽器,瀏覽器帶着票據ST的service參數的請求,請求SSO服務器驗證票據,驗證票據成功後,返回給瀏覽器用戶信息(通過cas協議約定的xml格式傳遞數據解析轉換成需要的用戶信息),設置session用戶上下文、cookie中設置TGC。

登錄點二次訪問

說明:用戶在上述“登錄點首次訪問”登錄成功後,再次訪問登錄點的應用服務時,判斷session中已經存在用戶上下文,就不再攔截,直接轉向到需要訪問的目標服務資源。

 

單點首次訪問

說明:同上述“登錄點首次訪問”的說明。


單點二次訪問

   與“登錄點二次訪問”相似。

單點退出


說明:用戶單點登錄後,有一個全局的過濾器SingleSignOutFilter對訪問的安全資源的ticket,sessionid記錄到一個映射表,我們暫稱其爲票據會話映射表。在一個子系統(如system1)執行單點退出"/logout"時,先銷燬system1的本地session,再向SSO服務器發送單點退出請求,SSO服務器接到這個請求後,將用戶認證票據TGT銷燬,清除瀏覽器cookie中的TGC,再讀取票據會話映射表,將其對應的票據ST,session全部銷燬。這樣用戶再訪問時各子系統時,是單點退出狀態,就需要重新登錄。

我們再詳細從CAS源碼中看看SSO單點退出實現機制。

SSO客戶端涉及源碼類圖如下:

一般web應用中一般部署在web.xml文件中,單點退出相關配置如下:

<listener>
        <listener-class>            edu.yale.its.tp.cas.client.session.SingleSignOutHttpSessionListener
        </listener-class>
    </listener>
    <filter>
        <filter-name>SingleSignOutFilter</filter-name>
        <filter-class>
            edu.yale.its.tp.cas.client.session.SingleSignOutFilter
        </filter-class>
    </filter>
   
    <filter>
        <filter-name>CasLogoutProxy</filter-name>
        <filter-class>
            edu.yale.its.tp.cas.exclient.SimpleServerLogoutHandler
        </filter-class>
        <init-param>
            <param-name>logoutUrl</param-name>
            <!--CAS Server  Logout URL-->
            <param-value>
                http://localhost:8080/ssoserver/logout
            </param-value>
        </init-param>

        <init-param>
            <!--CAS Client Application URL-->
            <param-name>serviceUrl</param-name>
            <param-value>
                http://localhost:8070/ssoclient/index.jsp
            </param-value>
        </init-param>
       
    </filter>
...
    <filter-mapping>   
        <filter-name>CasLogoutProxy</filter-name>
            <url-pattern>/logout</url-pattern>
        </filter-mapping>   
    <filter-mapping>
        <filter-name>SingleSignOutFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
說明:我們看到單點退出的相關類結構,web.xml配置了單點退出的相關類(1個監聽器SingleSignOutHttpSessionListener,2個過濾器SingleSignOutFilter,SimpleServerLogoutHandler)。實現利用了session存儲機制,SessionStoreManager是個單例類,用於管理session的存儲、刪除;SessionMappingStorage是session的存儲、刪除的執行者,可以看到實際存儲的結構是一個artifactId、sessionId爲名值對的HashMap表;監聽器SingleSignOutHttpSessionListener的作用是session銷燬時,調用session管理單例類SessionStoreManager進行session的刪除銷燬;SingleSignOutFilter的作用有2個:一個是在單點訪問攔截安全資源時調用單例類SessionStoreManager存儲session,另一個是在單點退出時調用單例類SessionStoreManager刪除session;SimpleServerLogoutHandler的作用是將客戶端的退出請求轉發到SSO服務器端,集中處理做各個子系統的單點退出。

      SSO服務器端單點退出涉及源碼類圖如下:

            

說明:用戶發送單點退出請求,轉向到SSO服務器的單點退出服務接口/logout,SSO服務器將每次web請求構造一個繼承類AbstractWebApplicationService的SimpleWebApplicationServiceImpl的實例,單點退出執行logOutOfService方法,銷燬票據、session等處理。


 

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