淺析單點登陸

  基本概念:Single Sign On 簡稱SSO,目前比較流行的企業業務整合的解決方案之一,是指在多系統應用羣中登陸一個系統,即可在其餘全部系統中獲得受權而無需再次登陸,包括單點登陸與單點註銷兩部分。php

  爲了實現單點登陸,就須要在多個Server上達到驗證同一個ID的效果,我所知道的有兩種方法能夠達成這個目的。以前的一種方法是「共享Cookie」,讓各個Server共用一個session信息,讓客戶端在各個域名下都能持有這個ID,從而檢驗處ID的有效性,獲得ID對應的用戶信息。用戶登陸成功拿到session-id後分享到其餘域名下,把session-id放入Cookie中,把他們的Cookie域設置成頂級域名,這樣全部的子域都可以讀取到Cookie裏的session-id,好比谷歌公司,google.com是他的頂級域名,郵箱服務的mail.google.com和地圖服務map.google.com都是他的子域(這種方式的實現就是共享Cookie)。java

        可是咱們會發現,共享Cookie的方式存在着許多的侷限性,首先,應用羣的域名須要統一,其次,應用羣各系統使用的技術(至少是web服務器)要相同,否則Cookie的Key值不一樣,沒法維持會話,而且共享Cookie沒法實現跨語言技術平臺登陸,好比java、.net、php之間,還有一點,就是Cookie自己並不安全。web

  這個時候就出現了另外一種實現方式就是單點登陸,生成一種在整個Server羣惟一的標識SSO-Token(受權令牌),全部Server羣都可以驗證這個token,同時拿到token背後表明的用戶信息。相比於單系統登陸,sso須要一個獨立的認證中心,只有認證中心能接受用戶的用戶名密碼等安全信息,其餘系統不提供登陸入口,只接受認證中心的間接受權。間接受權經過令牌實現,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與參數session

 

  單點登陸天然也要單點註銷,在一個子系統中註銷,全部子系統的會話都將被銷燬。簡單步驟以下:網站

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