SSO單點登陸原理

一.單系統登陸機制

1.http無狀態協議

   web應用採用browser/server架構,http做爲通訊協議。http是無狀態協議,瀏覽器的每一次請求,服務器會獨立處理,不與以前或以後的請求產生關聯,這個過程用下圖說明,三次請求/響應對之間沒有任何聯繫。php

  但這也同時意味着,任何用戶都能經過瀏覽器訪問服務器資源,若是想保護服務器的某些資源,必須限制瀏覽器請求;要限制瀏覽器請求,必須鑑別瀏覽器請求,響應合法請求,忽略非法請求;要鑑別瀏覽器請求,必須清楚瀏覽器請求狀態。既然http協議無狀態,那就讓服務器和瀏覽器共同維護一個狀態吧!這就是會話機制。java

2.會話跟蹤技術Cookie

  瀏覽器第一次請求服務器,服務器建立一個會話,並將會話的id做爲響應的一部分發送給瀏覽器,瀏覽器存儲會話id,並在後續第二次和第三次請求中帶上會話id,服務器取得請求中的會話id就知道是否是同一個用戶了,這個過程用下圖說明,後續請求與第一次請求產生了關聯。web

3.登陸狀態

  有了會話跟蹤,登陸狀態就好明白了,咱們假設瀏覽器第一次請求服務器須要輸入用戶名與密碼驗證身份,服務器拿到用戶名密碼去數據庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記爲「已受權」或者「已登陸」等等之類的狀態,既然是會話的狀態,天然要保存在會話對象(瀏覽器中)數據庫

二.多系統的複製性

  web系統早已從久遠的單系統發展成爲現在由多系統組成的應用羣,面對如此衆多的系統,用戶難道要一個一個登陸、而後一個一個註銷嗎?就像下圖描述的這樣瀏覽器

   web系統由單系統發展成多系統組成的應用羣,複雜性應該由系統內部承擔,而不是用戶。不管web系統內部多麼複雜,對用戶而言,都是一個統一的總體,也就是說,用戶訪問web系統的整個應用羣與訪問單個系統同樣,登陸/註銷只要一次就夠了tomcat

 

  雖然單系統的登陸解決方案很完美,但對於多系統應用羣已經再也不適用了,爲何呢?安全

  單系統登陸解決方案的核心是cookie,cookie攜帶會話id在瀏覽器與服務器之間維護會話狀態。但cookie是有限制的,這個限制就是cookie的域(一般對應網站的域名),瀏覽器發送http請求時會自動攜帶與該域匹配的cookie,而不是全部cookie服務器

  既然這樣,爲何不將web應用羣中全部子系統的域名統一在一個頂級域名下,例如「*.baidu.com」,而後將它們的cookie域設置爲「baidu.com」,這種作法理論上是能夠的,甚至早期不少多系統登陸就採用這種同域名共享cookie的方式。cookie

  然而,可行並不表明好,共享cookie的方式存在衆多侷限。首先,應用羣域名得統一;其次,應用羣各系統使用的技術(至少是web服務器)要相同,否則cookie的key值(tomcat爲JSESSIONID)不一樣,沒法維持會話,共享cookie的方式是沒法實現跨語言技術平臺登陸的,好比java、php、.net系統之間;第三,cookie自己不安全。架構

  所以,咱們須要一種全新的登陸方式來實現多系統應用羣的登陸,這就是單點登陸

 三.單點登陸

  什麼是單點登陸?單點登陸全稱Single Sign On(如下簡稱SSO),是指在多系統應用羣中登陸一個系統,即可在其餘全部系統中獲得受權而無需再次登陸,包括單點登陸與單點註銷兩部分

一、登陸

  下面對上圖簡要描述

  1. 用戶訪問系統1的受保護資源,系統1發現用戶未登陸,跳轉至sso認證中心,並將本身的地址做爲參數
  2. sso認證中心發現用戶未登陸,將用戶引導至登陸頁面
  3. 用戶輸入用戶名密碼提交登陸申請
  4. sso認證中心校驗用戶信息,建立用戶與sso認證中心之間的會話,稱爲全局會話,同時建立受權令牌
  5. sso認證中心帶着令牌跳轉會最初的請求地址(系統1)
  6. 系統1拿到令牌,去sso認證中心校驗令牌是否有效
  7. sso認證中心校驗令牌,返回有效,註冊系統1
  8. 系統1使用該令牌建立與用戶的會話,稱爲局部會話,返回受保護資源
  9. 用戶訪問系統2的受保護資源
  10. 系統2發現用戶未登陸,跳轉至sso認證中心,並將本身的地址做爲參數
  11. sso認證中心發現用戶已登陸,跳轉回系統2的地址,並附上令牌
  12. 系統2拿到令牌,去sso認證中心校驗令牌是否有效
  13. sso認證中心校驗令牌,返回有效,註冊系統2
  14. 系統2使用該令牌建立與用戶的局部會話,返回受保護資源

  用戶登陸成功以後,會與sso認證中心及各個子系統創建會話,用戶與sso認證中心創建的會話稱爲全局會話,用戶與各個子系統創建的會話稱爲局部會話,局部會話創建以後,用戶訪問子系統受保護資源將再也不經過sso認證中心,全局會話與局部會話有以下約束關係

  1. 局部會話存在,全局會話必定存在
  2. 全局會話存在,局部會話不必定存在
  3. 全局會話銷燬,局部會話必須銷燬

  你能夠經過博客園、百度、csdn、淘寶等網站的登陸過程加深對單點登陸的理解,注意觀察登陸過程當中的跳轉url與參數

二、註銷

  單點登陸天然也要單點註銷,在一個子系統中註銷,全部子系統的會話都將被銷燬,用下面的圖來講明

 sso認證中心一直監聽全局會話的狀態,一旦全局會話銷燬,監聽器將通知全部註冊系統執行註銷操做

  下面對上圖簡要說明

  1. 用戶向系統1發起註銷請求
  2. 系統1根據用戶與系統1創建的會話id拿到令牌,向sso認證中心發起註銷請求
  3. sso認證中心校驗令牌有效,銷燬全局會話,同時取出全部用此令牌註冊的系統地址
  4. sso認證中心向全部註冊系統發起註銷請求
  5. 各註冊系統接收sso認證中心的註銷請求,銷燬局部會話
  6. sso認證中心引導用戶至登陸頁面
相關文章
相關標籤/搜索