1. 程式人生 > >單點登入SSO:圖示和講解

單點登入SSO:圖示和講解

敢說最準確的單點登入圖示,因為:

我嚴格對照所畫時序圖的每個步驟,開發了完整的跨域單點登入範例;

時序圖繪出的所有服務端步驟,都在程式碼中逐一標註對應,跟蹤除錯程式碼就能兩相對照,深入理解流程;

跨域Web SSO的核心在於寫cookie、URL傳參策略。其參與物件多、邏輯分支繁雜也難倒很多人。所見的其它教程圖示往往對cookie和傳參語焉不詳,讓人初看簡單明瞭、細想很困惑。我做的時序圖詳細展現了這些關鍵細節。

話不多說,先上圖吧。

一 示例執行效果動畫

百寶門跨域Web SSO方案演示

圖一 百寶門跨域Web SSO方案演示

二 跨域Web SSO時序圖

會比其它單點登入教程暴露更多比較重要的細節,沒基礎初看可能會暈。請先讀完下面的知識點講解,再回頭理解本圖,尤其是注意各個URL傳參、以及寫cookie的動作。

該圖也將作為跨域Web SSO原理的核心,在後繼相關文章中反覆引用到。

最準確的SSO時序圖

圖二 跨域Web SSO時序圖。包含cookie、URL具體跳轉策略。是透徹理解和掌握跨域Web單點登入的核心。

三 單點登入程式碼截圖

程式碼邏輯嚴格和時序圖對應,在註釋中標明瞭對應的步驟編號:

單點登入SSO程式碼

圖三 單點登入範例程式碼。和時序圖逐一對應標註

四 幾個基本概念

4.1  什麼是跨域Web SSO。

域名通過“.”號切分後,從右往左看,不包含“.”的是頂級域名,包含一個“.”的是一級域名,包含兩個“.”的是二級域名,以此類推。

例如對網址http://www.cnblogs.com/baibaomen,域名部分是

www.cnblogs.com。用“.”拆分後從右往左看:

”com”不包含“.”,是頂級域名; “cnblogs.com”包含一個“.”,是一級域名;www.cnblogs.com包含兩個“.”,是二級域名。

跨域Web SSO指的是針對Web站點,各級域名不同都能處理的單點登入方案。

4.2  瀏覽器讀寫cookie的安全性限制:一級或頂級域名不同的網站,無法讀到彼此寫的cookie。

所以baidu.com無法讀到cnblogs.com寫的cookie。

一級域名相同,只是二級或更高階域名不同的站點,可以通過設定domain引數共享cookie讀寫。這種場景可以選擇不跨域的SSO方案。

域名相同,只是https和http協議不同的URL,預設cookie可以共享。知道這一點對處理SSO服務中心要登出

4.3  http協議是無狀態協議。瀏覽器訪問伺服器時,要讓伺服器知道你是誰,只有兩種方式:

方式一:把“你是誰”寫入cookie。它會隨每次HTTP請求帶到服務端;

方式二:在URL、表單資料中帶上你的使用者資訊(也可能在HTTP頭部)。這種方式依賴於從特定的網頁入口進入,因為只有走特定的入口,才有機會拼裝出相應的資訊,提交到服務端。

大部分SSO需求都希望不依賴特定的網頁入口(整合門戶除外),所以後一種方式有侷限性。適應性強的方式是第一種,即在瀏覽器通過cookie儲存使用者資訊相關憑據,隨每次請求傳遞到服務端。本文的方案是第一種。

五 本單點登入的應用場景涉及的站點和頁面

5.1  SSO服務站點,圖中是sso.baibaomen.com;

5.2  整合SSO的子站點一。圖中是java-client.net;

5.3  整合SSO的子站點二。圖中是php-client.cn;

5.4  SSO服務站點有登入/登出頁面login.html,以及基於.NET的幾個handler:sso/login/validate/logout。

為了說清楚在各子站點首次訪問和後繼訪問的單點登入流程,分別做了兩個需登入訪問的頁面:

java-client.net的兩個頁面是auth-required.jsp和auth-required2.jsp;php-client.cn的兩個頁面是auth-required.php和auth-required2.php。

六 重點理解:單點登入的核心步驟

本節是幫助各位速掌握單點登入的核心步驟。為避免過多資訊干擾理解,略去了非主幹的細節。為透徹把握細節,請在理解本節後,再仔細對照學習SSO時序圖。

6.1  使用者未登入時訪問子站一,子站一伺服器檢測到使用者沒登入(沒有本站session,因為沒傳過來session對應cookie),於是通知瀏覽器跳轉到SSO服務站點,並在跳轉的URL引數中帶上當前頁面地址,以便登入後自動跳轉回本頁。

6.2  SSO服務站點檢測到使用者沒有登入,於是顯示登入介面。

使用者提交登入請求到服務端,服務端驗證通過,建立和賬號對應的使用者登入憑據(token)。

然後,服務端通知瀏覽器把該token作為SSO服務站點的cookie儲存起來,並跳轉回子站一,跳回子站一的URL引數中會帶上這個token。

6.3  瀏覽器在寫SSO服務站點cookie後,跳轉回子站一。

子站一服務端檢測到瀏覽器請求的URL中帶了單點登入的token,於是把這個token發到SSO服務站點驗證。

SSO服務端站點拿token解密出使用者賬號,把賬號資訊中允許子站一訪問的部分返回給子站一。

子站一根據返回的資訊生成使用者在本站的會話,把會話對應cookie寫入瀏覽器,從而完成在本站的登入以及會話保持。之後使用者訪問再子站一時,都會帶上這個cookie,從而保持在本站的登入狀態。

6.4  使用者再訪問子站二。子站二伺服器檢測到使用者沒登入,於是通知瀏覽器跳轉到SSO服務站點。

6.5  瀏覽器訪問SSO服務站點時會帶上上述6.2環節建立的token這個cookie。SSO服務站點根據該token能找到對應使用者,於是通知瀏覽器跳轉回子站二,並在跳轉回去的URL引數中帶上這個token。

6.6  子站二服務端檢測到瀏覽器請求的URL中帶上了單點登入的token,於是又會走上述6.3對應步驟,完成使用者在本站的自動登入。

單點登出的流程,將在下篇完整程式碼例項中,一併講解。

為方便大家討論交流,除了時序圖,本文各章節也作了詳細編號。有疑問的童鞋,請儘可能在回覆中包含有疑問部分的編號,這樣可以快速定位。

原文地址:http://www.cnblogs.com/baibaomen/p/sso-sequence-chart.html 。轉載須保留本連結。

本系列各篇連結:

單點登入-SSO:概述與示例 http://www.cnblogs.com/baibaomen/p/sso.html

單點登入-SSO:圖示和講解 http://www.cnblogs.com/baibaomen/p/sso-sequence-chart.html

單點登入-SSO:一鍵執行的完整程式碼 http://www.cnblogs.com/baibaomen/p/sso-full-code.html

我的部落格歡迎複製共享,但在同時,請保留原文地址以及我的署名權百寶門-SSO顧問,並且,不得用於商業用途。

如您有任何疑問或者授權方面的協商,請給我郵件。 

我的公眾號“百寶門”