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/