1 基礎知識 單點登錄機制(SSO)允許用戶登錄應用程式一次,並訪問所有相關的系統,而不需要單獨登錄它們。 由於 SSO,用戶只需登錄一次即可使用服務,並自動登錄到所有相關應用程式。SSO 消除了單獨登錄它們的需要。此外,用戶不需要存儲或記住多個憑據。 單點登錄僅與身份驗證過程相關。它的任務是驗證用 ...
1 基礎知識
單點登錄機制(SSO)允許用戶登錄應用程式一次,並訪問所有相關的系統,而不需要單獨登錄它們。
由於 SSO,用戶只需登錄一次即可使用服務,並自動登錄到所有相關應用程式。SSO 消除了單獨登錄它們的需要。此外,用戶不需要存儲或記住多個憑據。
單點登錄僅與身份驗證過程相關。它的任務是驗證用戶的身份,併在相關應用程式之間共用該信息。
2 工作流程
讓我們簡單介紹一下SSO解決的問題。我們希望用戶能夠在 domain1 和 domain2 使用相同的登錄名和密碼登錄。此外,如果用戶已經在 domain1 登錄,則應該在 domain2 自動登錄,反之亦然。解決方案是在域之間共用會話數據。但是,由於同源策略,cookie不能在域之間共用。因此,SSO通過對用戶進行身份驗證並以各種方式共用他們的會話數據來解決問題。
通常,有一個中心域來標識用戶並共用他們的會話數據,例如,以JWT的形式。讓我們大致描述一下SSO過程。
- 用戶進入 domain1
- domain1 檢查沒有會話 cookie,因此將用戶重定向到 SSO 系統
- SSO 系統檢查沒有會話 cookie,因此提示登錄頁面
- SSO 系統對用戶進行身份驗證
- SSO 系統設置會話 cookie(如果身份驗證成功)
- SSO 系統使用包含會話數據的參數(例如 JWT)重定向回 domain1
- domain1 使用傳遞的數據設置會話 cookie
- 用戶進入 domain2
- domain2 檢查沒有會話 cookie,因此將用戶重定向到 SSO 系統
- SSO 系統檢查會話 cookie 是否存在
- SSO 系統使用包含會話數據的參數(例如 JWT)重定向回 domain2
- domain2 使用傳遞的數據設置會話 cookie
上面的方法是最普遍的一種。它可以根據實現的SSO配置和體繫結構而有所不同。下麵我們可以在圖表中看到前面描述的過程:
3 實現方案
有多種架構可用於實現 SSO
最常用的一種是 WEB SSO 。WEB SSO 僅適用於可以使用 Web 瀏覽器訪問的服務。它允許用戶通過一次登錄訪問一組 Web 伺服器。實現 WEB SSO 主要有兩種方法:
- 使用基於 Web 的反向代理控制身份驗證過程
- 使用安裝在每個特定伺服器上的代理
這種架構通常使用 cookie 來跟蹤用戶的身份驗證狀態。前面介紹的 SSO 流程適用於 WEB SSO 架構。
另一種架構稱為企業單點登錄(E-SSO)。它與 WEB SSO 略有不同,並且更改對最終用戶是透明的。用戶擁有 E-SSO 客戶端的單一憑據,並且僅登錄一次。 E-SSO 處理登錄到相關應用程式。不同之處在於服務可以具有單獨的身份驗證憑據。由 E-SSO 客戶端維護。此外,應用程式不需要瞭解 E-SSO 客戶端。當組織想要為已經存在和配置好的系統提供SSO時,這種架構通常尤其適用。
4 優點和缺點
讓我們分析一下SSO解決方案的優缺點。
有點:
- 簡化使用多種服務的最終用戶的登錄過程
- 減少忘記憑證或憑證無效的情況。因此,它減少運維的成本和工作量
- 簡化憑證管理
- 通過減少憑據暴露來提高安全性
- 可以改善組織之間的整合與合作
缺點:
- 當提供SSO服務的程式關閉(宕機)時,所有應用程式都無法訪問
- 實現SSO可能耗時且代價高昂
- 通過竊取SSO憑據,黑客可以訪問所有相關的系統
- 必須強制使用強而複雜的密碼
- 一些SSO提供者與第三方共用數據。需要對供應商的條款和政策進行深入研究。
5 有用的文檔
Spring Security OAuth 2 Guides
- https://www.baeldung.com/cs/sso-guide
- https://www.baeldung.com/spring-security-oauth
- https://www.baeldung.com/sso-spring-security-oauth2
- https://www.baeldung.com/spring-security-oauth-jwt
- https://www.baeldung.com/spring-security-authentication-and-registration
- https://www.baeldung.com/spring-security-5-oauth2-login
- https://www.baeldung.com/spring-cloud-gateway-oauth2
- https://spring.io/guides/tutorials/spring-boot-oauth2/
- https://developer.okta.com/blog/2018/04/10/oauth-authorization-code-grant-type
- https://www.amitph.com/spring-security-oauth2-login/
- https://www.amitph.com/spring-tutorials/