单点登录(SSO,Single Sign-On)是一种用户身份验证服务,允许用户使用一组登录凭据(如用户名和密码)访问多个应用程序或系统。SSO旨在提高用户体验和安全性,通过减少用户需要记住的密码数量,降低密码疲劳和重用的风险。以下是SSO工作原理的概述以及常见的实现技术。
工作原理
-
初始登录:
- 用户首次尝试访问SSO集成的任何应用时,会被重定向到SSO服务的登录页面。
- 用户在这里输入一次用户名和密码。
-
身份验证:
- SSO服务验证用户的凭据。如果凭据有效,SSO服务会为用户创建一个会话,并发给用户一个令牌(Token)或票据(Ticket)。
-
令牌传递:
- 用户随后尝试访问另一个集成了SSO的应用时,SSO服务会利用已经建立的会话,不需要用户重新输入凭据,直接允许访问。
- 用户的浏览器会向SSO服务发送令牌作为访问其他服务的凭据。
-
服务提供方验证:
- 每个应用或服务都会向SSO服务验证用户令牌的有效性。一旦验证通过,用户就可以访问该应用或服务。
-
会话结束:
- 用户登出时,SSO服务可以结束用户在所有应用中的会话,实现一处登出,处处登出的效果。
常见实现技术
-
LDAP(轻量级目录访问协议):
- LDAP常用于企业环境中,作为对用户身份信息进行存储和访问的目录服务。
-
SAML(安全断言标记语言):
- SAML是一种基于XML的开放标准,用于在安全域之间交换认证和授权数据。SAML广泛应用于企业级SSO解决方案中,特别是在Web应用和服务之间。
-
OAuth和OpenID Connect:
- OAuth是一个授权框架,允许应用获取有限的访问权限。OpenID Connect建立在OAuth 2.0之上,添加了用户身份验证层,广泛应用于互联网服务的SSO。
-
Kerberos:
- Kerberos是一种网络身份验证协议,使用密钥加密技术,允许节点在不安全网络上安全地证明其身份。
优点
- 提高用户体验:用户只需记住和使用一组凭据,就可以访问所有集成的服务和应用。
- 提高安全性:减少密码重用和疲劳,同时集中管理用户凭据和访问控制。
- 简化管理:简化了对用户账户和访问权限的管理,尤其是在大型组织中。
缺点
- 单点故障:SSO系统本身如果出现问题,可能会影响到所有依赖它的服务和应用。
- 安全风险:如果SSO系统被攻破,攻击者可能获得对所有集成服务的访问权限。
SSO解决方案需要在提高用户体验和安全性之间找到平衡,同时确保对SSO系统本身的高度保护。
典型的单点登录(SSO)场景,其中包括多个应用或服务,用户在任何一个应用登录后,可以无需再次登录即可访问其他所有应用。以下是触发SSO流程的步骤:
步骤1:用户访问应用A
- 假设用户首次尝试访问应用A的受保护资源,例如
http://appA.com/protectedPage
。 - 由于用户尚未登录,请求会被
SSOFilter
拦截。由于会话中没有用户信息(USER_INFO
为空),且请求URL不是登录页面或处理登录的URL,SSOFilter
会检查请求中是否包含票据(ticket
)。
步骤2:重定向到SSO登录页面
- 由于用户未登录且请求中没有票据,
SSOFilter
将用户重定向到SSO系统的登录页面,并附加原始请求的URL作为参数,例如http://sso.com/toLogin?url=http://appA.com/protectedPage
。
步骤3:用户在SSO系统中登录
- 用户在SSO登录页面输入凭据并提交。SSO系统验证用户凭据,登录成功后,SSO系统生成一个唯一的票据(
ticket
),并将票据与用户信息关联存储在Redis中。
步骤4:重定向回原始应用
- 登录成功后,SSO系统将用户重定向回原始请求的URL,并附加票据参数,例如
http://appA.com/protectedPage?ticket=uniqueTicket123
。
步骤5:使用票据获取用户信息
SSOFilter
再次拦截到用户请求,这次请求中包含票据。SSOFilter
使用票据从Redis中获取用户信息,如果成功获取,将用户信息存储在会话中,并删除Redis中的票据。
步骤6:访问受保护资源
- 用户信息存储在会话中后,
SSOFilter
放行请求,允许用户访问受保护资源。
步骤7:访问其他应用
- 用户随后尝试访问另一个集成SSO的应用B的受保护资源。由于用户已在应用A通过SSO登录,应用B的
SSOFilter
可以从会话中获取用户信息,无需再次登录,用户即可访问应用B的受保护资源。
这个流程展示了单点登录的核心优势,即用户只需登录一次,就可以在多个应用或服务之间无缝切换,极大地提升了用户体验。在实际部署中,需要确保所有应用都能正确处理SSO票据,并能与SSO系统以及Redis等后端服务安全地交互。