业务背景
在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,用户用不同的账号即可登录,很方便。 但随着企业的发展,用到的系统随之增多,用户在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于用户来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。
什么是 SSO?
单点登录(Single Sign-On, SSO)是一种用户认证机制,允许用户在一个地方登录后,能够访问多个相关但独立的软件系统,而无需在每个系统中重新登录。这种机制简化了用户的登录过程,提升了用户体验,同时也便于企业对用户身份的集中管理和安全控制。
SSO 的主要特点
- 一次登录,多处访问:
○ 用户只需进行一次身份验证,就可以访问多个应用程序或系统,无需重复输入用户名和密码。 - 集中管理:
○ SSO 允许企业集中管理用户的身份和权限,从而简化用户账户的管理,降低管理成本。 - 提升用户体验:
○ 减少了用户的登录次数,提高了用户的操作效率和满意度。 - 增强安全性:
○ 通过集中管理和统一的认证机制,可以更有效地实施安全策略和监控,减少了密码疲劳和密码泄露的风险。
SSO 有什么好处?
单点登录(SSO)为用户和组织提供了许多好处,从提高用户体验到增强安全性,具体好处如下:
对用户的好处
- 简化登录流程:
○ 用户只需一次登录即可访问多个应用程序,减少了重复输入用户名和密码的次数。 - 提高用户体验:
○ 简化的登录流程提升了用户对系统的满意度和使用效率。 - 减少密码疲劳:
○ 用户只需记住一个密码,降低了忘记密码的可能性,减少了重置密码的需求。 - 无缝切换:
○ 用户可以在不同的应用程序之间无缝切换,不需要每次都重新登录。
对组织的好处
- 集中管理:
○ 集中管理用户身份和访问权限,简化了用户账户的管理,提高了管理效率。 - 增强安全性:
○ 通过统一的认证机制和策略,可以更好地实施和监控安全策略,减少了弱密码和密码泄露的风险。 - 降低管理成本:
○ 减少了支持和管理多个认证系统的开销,降低了 IT 支持的工作量。 - 合规性:
○ 统一的认证和授权机制有助于企业满足各种法规和合规要求(如 GDPR、HIPAA 等)。 - 提高生产力:
○ 用户不需要频繁登录和记住多个凭证,可以更专注于实际工作,提升整体工作效率。 - 数据一致性:
○ 通过集中管理用户信息,可以确保各个系统中用户数据的一致性,减少数据冗余和错误。
技术和安全优势
- 统一的身份验证:
○ 通过使用标准的认证协议(如 OAuth、OpenID Connect、SAML),可以实现跨平台和跨组织的身份验证。 - 多因素认证(MFA)集成:
○ SSO 系统通常支持集成多因素认证,进一步增强了系统的安全性。 - 简化权限管理:
○ 通过 SSO,可以统一管理用户的访问权限,确保只有授权用户才能访问特定资源。 - 日志和监控:
○ 统一的认证机制使得日志记录和监控更加容易,帮助企业及时发现和应对安全威胁。
实际应用场景
- 企业内部系统整合:
○ 企业内部有多个业务系统,通过 SSO 实现统一访问,提高员工的工作效率和满意度。 - 跨组织合作:
○ 不同组织之间的合作需要访问共享的资源,通过 SSO 可以简化身份验证流程,提高协作效率。 - SaaS 和云服务:
○ 企业使用多个 SaaS 应用和云服务,通过 SSO 实现统一登录和管理,简化了用户的访问流程。
总的来说,SSO 通过简化登录流程、集中管理用户身份和访问权限、增强安全性和提高用户体验,成为现代企业和组织不可或缺的技术手段。
单点登录设计与实现
同域名下的单点登录
一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com 和 app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。
我们只要在 sso.a.com 登录,app1.a.com 和 app2.a.com 就也登录了。通过上面的登陆认证机制,我们可以知道,在 sso.a.com 中登录了,其实是在 sso.a.com 的服务端的 session 中记录了登录状态,同时在浏览器端(Browser)的 sso.a.com 下写入了 Cookie。
那么我们怎么才能让 app1.a.com 和 app2.a.com 登录呢?这里有两个问题:
- Cookie 是不能跨域的,我们 Cookie 的 domain 属性是 sso.a.com,在给 app1.a.com 和 app2.a.com 发送请求是带不上的。
- sso、app1 和 app2 是不同的应用,它们的 session 存在自己的应用内,是不共享的。
- 针对第一个问题,我们可以把 Cookie 的域设置为顶域,这样所有子域的系统都可以访问到顶域的 Cookie。
- 针对第二个问题,我们可以把 Session 进行共享,共享的方法有很多,这里就不展开说了。
在这种情况下,同域名下的单点登录就实现了,但这并不是真正的单点登录。
不同域下的单点登录
当企业系统分布在不同的顶级域名下时,情况变得更加复杂。例如,假设企业除了拥有 app1.a.com 和 app2.a.com,还有一个合作伙伴系统位于 partner.b.com。此时,简单的 Cookie 顶域设置和 Session 共享不再适用,因为它们无法跨越不同的顶级域名。
为了解决跨域的单点登录问题,我们通常采用以下几种策略:
- 中介 Token 机制 步骤:
a. 用户在 SSO 系统(sso.a.com)登录,认证成功后,SSO 系统生成一个全局唯一的 Token。
b. SSO 系统将 Token 通过 URL 重定向的方式传给客户端,客户端再携带此 Token 访问目标系统(如 app1.a.com)。
c. app1.a.com 接收到 Token 后,向 SSO 系统发起验证请求,确认 Token 的有效性(通常包含用户身份信息)。
d. 验证通过后,app1.a.com 在本地存储(如 Cookie 或 LocalStorage)中保存该 Token,并标记用户为已登录状态。 优势:解耦了各个系统的登录状态,提高了安全性,支持跨域。 - OAuth / OpenID Connect
概念:OAuth 2.0 和 OpenID Connect 是广泛采用的身份验证和授权标准,非常适合处理跨域的单点登录。通俗点说,就是外卖小哥进入小区,不需要刷门禁卡,而是打电话给你,你跟门卫叔叔说让外卖小哥进入小区里面。 流程:
a. 用户在客户端应用请求登录时,被重定向到认证服务器(可能是 SSO 系统)。
b. 用户在认证服务器完成身份验证,认证服务器返回一个授权码或 ID Token 给客户端。
c. 客户端携带授权码向认证服务器请求访问令牌(Access Token)。
d. 认证服务器验证后,发放 Access Token 给客户端。
e. 客户端使用 Access Token 向资源服务器请求受保护资源,实现登录。 优点:标准化流程,安全可靠,广泛兼容,适用于不同组织和第三方应用之间的单点登录。