概念
單點登錄(Singleton Sign On),簡稱為SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就能訪問所有相互信任的應用系統。
也就是說在一個多系統共存的環境下,用戶在一處登錄后,就不用在其他系統中登錄,也就是用戶的一次登錄就能得到其他所有系統的信任。單點登錄在大型網站中使用非常頻繁,例如阿里這里的網站,在網站的背后是成百上千的子系統,用戶一次操作或交易可能涉及到幾十個子系統的協作,如果每個子系統都需要用戶認證,不僅用戶操作繁瑣,各子系統重復認證授權也十分繁瑣,因此實現單點登錄說到底就是解決產生和存儲信任,再就是其他系統驗證信任的有效性。
實現方案
方案一、Cookie
原理:實現一次登錄和一次退出,session是保持登錄狀態關鍵的東西,客戶端持有ID,服務端持有session,兩者一起用來保持登錄狀態。客戶端需要用ID來作為憑證,二服務端需要用session來驗證ID的有效性。但是不同的服務有自己的Session,因此要想辦法讓各個server共用session信息
缺陷:1、Cookie不安全(可以采取Cookie加密提高安全性)
2、不能跨域免登
方案二、Token
原理:將信任關系存儲在單獨的SS哦系統里,也就是從客戶端移到了服務端。
解決問題:1、如何高效的存儲大量臨時性的信任數據
2、如何防止信息傳遞過程被篡改
3、如何讓SSO系統信任登陸系統和免登系統
解決方案:1、采用類似memcached的分布式緩存的方案,既能提供可擴展數據量的機制,也能提供高效訪問。
2、采用數字簽名(數字證書簽名或md5等加密方式),這就需要SS哦系統返回免登URL的時候對需要驗證的參數進行加密,並帶上token一起返回。最后需免登陸的系統進行驗證信任關系的時候,需把這個token傳給SSO系統,SSO系統通過對token的驗證就可以辨別信息是否被改過
3、設置白名單,也就是只有白名單上的系統才能請求信任關系,同理只有在白名單上的系統才能被免登陸。
基本概念:
1、什么是跨域Web SSO:
域名通過“.”號切分后,從右往左看,不包含"."的是頂級域名,包含一個"."的是一級域名,包含兩個"."的是二級域名,依次類推。
https://www.baidu.com:com是頂級域名,baidu.com是一級域名,www.baidu.com是二級域名。
2、瀏覽器讀寫cookie的安全性限制:一級或頂級域名不同的網站,無法讀取到彼此寫的cookie
一級域名相同,只是二級或更高級域名不同的站點,可以通過設置domain參數共享cookie的讀寫。這種場景可以選擇不跨域的SSO方案
域名相同,只是https和http協議不同的URL默認cookie可以共享。
3、http協議是無狀態協議,瀏覽器訪問服務器時,要讓服務器知道你是誰,只有兩種方式:
1)將信息寫入cookie,它會隨着每次HTTP請求帶到服務端
2)在URL、表單數據中帶上用戶信息(也可能在HTTP頭部)。這種方式依賴於從特定的網頁入口進入,因為只有走特定的入口,才有機會拼裝出相應的信息,提交到服務端。
單點登錄的核心步驟:
1、用戶未登錄時訪問子站一、子站一服務器檢測到用戶沒有登錄(沒有本站點session,因為沒傳過來session對應的cookie),於是通知瀏覽器跳轉到SSO服務站點,並在跳轉的URL參數中帶上當前的頁面地址,以便登錄后自動跳轉回本頁。
2、SSO服務站點檢測到用戶沒有登錄,於是顯示登錄頁面
用戶提交登錄請求道服務端,服務端驗證通過,創建和賬號對應的用戶登陸憑證(token)
然后,服務端通知瀏覽器把該token作為SSO服務站點的cookie存儲起來,並跳轉回子站一,跳回子站的URL參數中帶上這個token
3、瀏覽器在寫SSO服務站點cookie后,跳轉回子站一。
子站一服務端檢測到瀏覽器請求的URL中帶了單點登錄的token,於是把這個token發到SSO服務站點驗證。
SSO服務端站點拿token解密出用戶賬號,把賬號信息中允許子站一訪問的部分返回給子站一。
子站一根據返回的信息生成用戶在本站的會話,把會話對應cookie寫入瀏覽器,從而完成在本站的登入以及會話保持。之后用戶訪問再子站一時,都會帶上這個cookie,從而保持在本站的登錄狀態。