引言
單點登錄有許多開發商提供解決方案,本文以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> |
SSO服務器端單點退出涉及源碼類圖如下:
說明:用戶發送單點退出請求,轉向到SSO服務器的單點退出服務接口/logout,SSO服務器將每次web請求構造一個繼承類AbstractWebApplicationService的SimpleWebApplicationServiceImpl的實例,單點退出執行logOutOfService方法,銷燬票據、session等處理。