最準確的單點登錄SSO圖示和講解(有代碼範例)|手把手教做單點登錄(SSO)系列之二

来源:http://www.cnblogs.com/baibaomen/archive/2017/05/08/sso-sequence-chart.html
-Advertisement-
Play Games

周末沒出門,熬了兩個夜整理代碼、打磨圖示,給大家奉上本文。敢說最準確,因為:1. 我嚴格對照所畫時序圖的每個步驟,開發了完整的跨域單點登錄範例;2. 所有服務端步驟,都在代碼中逐一標註,跟蹤代碼就能兩相對照,實際的深入理解流程;3. SSO核心在寫Cookie、URL傳參策略,其參與對象多、邏輯分支... ...


寫第一篇博客《手把手教做單點登錄(SSO)系列之一:概述與示例》,就獲得了園子里朋友們熱情的評論和推薦,感謝各位。

我那篇文章同時發了CSDN和博客園。對比一下,更感受到博客園童鞋們的技術交流熱情:這篇文章在CSDN也有幾百閱讀量了,但評論區還靜悄悄的。博客園才幾天就有四十多個回覆、二十多位童鞋推薦了。

 

深受鼓舞,周末沒出門,熬了兩個夜打磨圖示、整理代碼,給大家奉上本文。

完整的代碼範例已完成,因和本文時序圖嚴格對照,註釋整理還需要一些工作,完成後將在下一篇放出。大家下載配置後,本地跑起來會是圖一動畫所示的運行效果,敬請期待。

敢說最準確,因為:

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

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

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

 

話不多說,先上圖吧。

1. 示例運行效果圖:

 百寶門跨域Web SSO方案演示

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

 

2. 跨域Web SSO時序圖。會比其它教程暴露更多比較重要的細節,沒基礎初看可能會暈。請先讀完下麵的知識點講解,再回頭理解本圖,尤其是註意各個URL傳參、以及寫cookie的動作。

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

 最準確的SSO時序圖

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

 

 

3. 代碼截圖。代碼邏輯嚴格和時序圖對應,在註釋中標明瞭對應的步驟編號:

 

單點登錄SSO代碼

圖三 範例代碼。和時序圖逐一對應標註

  

4    幾個基本概念

4.1  什麼是跨域Web SSO。

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

例如對網址http://www.cnblogs.com/baibaomen,功能變數名稱部分是www.cnblogs.com。用“.”拆分後從右往左看:

”com”不包含“.”,是頂級功能變數名稱; “cnblogs.com”包含一個“.”,是一級功能變數名稱;www.cnblogs.com包含兩個“.”,是二級功能變數名稱。

跨域Web SSO指的是針對Web站點,各級功能變數名稱不同都能處理的SSO方案。

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    本單點登錄的應用場景涉及的站點和頁面

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。

 

6    重點理解:單點登錄的核心步驟描述

本節是幫助各位速掌握單點登錄的核心步驟。為避免過多信息干擾理解,略去了非主幹的細節。為透徹把握細節,請在理解本節後,再仔細對照學習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 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. ...
  • 看了好多關於代理的文章,理解和整理一下。 1、代理的基本構成 抽象角色:聲明真實對象和代理對象的共同介面,這樣可在任何使用真實對象的地方都可以使用代理對象。 代理角色:代理對象內部含有真實對象的引用,從而可以在任何時候操作真實對象。代理對象提供一個與真實對象相同的介面,以便可以在任何時候替代真實對象 ...
  • Description Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate ex ...
  • Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equal t... ...
  • 首先瞭解一下Python的優點: Python為我們提供了非常完善的基礎代碼庫,覆蓋了網路、文件、GUI、資料庫、文本等大量內容,被形象地稱作“內置電池(batteries included)”。用Python開發,許多功能不必從零編寫,直接使用現成的即可。 除了內置的庫外,Python還有大量的第 ...
  • 上篇博客我們聊了《JavaEE開發之SpringBoot工程的創建、運行與配置》,從上篇博客的內容我們不難看出SpringBoot的便捷。本篇博客我們繼續在上篇博客的基礎上來看一下SpringBoot是如何引入和使用MyBatis和Thymeleaf的。在之前的博客中我們提到過Hibernate,今 ...
  • jvm記憶體模型 u 程式計數器 u Java棧(虛擬機棧) u 本地方法棧 u Java堆 u 方法區及其運行時常量池 垃圾回收機制 u 新生代和老年代 u 參數設置 u 垃圾回收(Minor GC 和 Full GC)和回收演算法 u finalize()、減少GC開銷、觸發主GC的條件 u 判斷無 ...
  • HashSet:哈希表是通過使用稱為散列法的機制來存儲信息的,元素並沒有以某種特定順序來存放; LinkedHashSet:以元素插入的順序來維護集合的鏈接表,允許以插入的順序在集合中迭代; TreeSet:提供一個使用樹結構存儲Set介面的實現,對象以升序順序存儲,訪問和遍歷的時間很快。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...