單點登入有兩種模型,一種是共同父域下的單點登入(例如網域名稱都是 xx.a.com),還有就是完全跨域下的單點登入(例如網域名稱是xx.a.com,xx.b.com),本文我們講一下完全跨域下的單點登入該怎麼實現。
基於安全考慮,想通過cookie來實現這個功能是不太可能的了(也許有其他黑科技可以實現,這裡不做討論)。這裡介紹的方案是參考shiro框架的跨域session共享方案來實現的。我們知道瀏覽器訪問系統的時候會生成乙個session,那麼每次請求如何知道是來自同乙個瀏覽器呢?是因為瀏覽器為每個域儲存了乙個可以稱作為session的cookie的東西,每次請求該域都會把對應的這個cookie帶上,然後伺服器根據這個cookie值去查詢對應的session。
想要達到完全跨域的單點登入要滿足兩個條件:
第乙個條件通過使用spring-session框架把session儲存在redis中,可以很容易實現。
那麼第二個條件如何實現呢?答案就是想方法為每個域設定相同的session的cookie 。
舉個例子,比如有a、b兩個站點網域名稱分別是www.a.com,www.b.com,這兩個網域名稱需要共享session,並且已b網域名稱下的session為主,a登入時跳轉到b域進行登入,成功登入之後重定向到a時把sessionid帶上,a站點拿到sessionid之後回寫到瀏覽器覆蓋原來生成的session的cookie。這時再次訪問a站點用的就是同乙個session了。大概畫乙個圖如下:
上述方案可以實現完全跨域下的單點登入,但是存在乙個很大的問題,就是安全問題!
假如在第④步操作重定向回a站點時,請求鏈結被不法分子攔截到了,他拿著這個鏈結就可以直接訪問a站點了。
安全問題解決方案如下圖:
其實⑥、⑦兩步主要要解決的問題是,向b(認證伺服器)證明:「我請求認證我是合法請求,我不是非法請求」。認證成功後,返回sessionid。
基於Redis實現的單點登入
背景 每個web應用都有自己的session,那如何在分布式或者集群環境下統一session,即如何實現單點登入,如下圖 解決方案 把session資料存放在redis,統一管理,向外提供服務介面,redis可以設定過期時間,對應session的失效時間 優點 訪問速度快,效率高 無單點故障,可以部...
單點登入 基於code
前後端分離專案 const singlelogin async const gotoindex async code string 0 return 如果失敗去設定使用者錯誤資訊 setuserloginstate msg catch error setsubmitting false useeff...
C 基於Redis快取實現單點登入SSO的例項
最近公司的多個業務系統要統一整合使用同乙個登入,這就是我們耳熟能詳的單點登入,現在就net基於redis快取實現單點登入做乙個簡單的分享。單點登入 single sign on 簡稱為 sso,是目前比較流行的企業業務整合的解決方案之一。sso的定義是在多個應用系統中,使用者只需要登入一次就可以訪問...