跳到主要内容

认识

2025年01月07日
柏拉文
越努力,越幸运

一、认识


Web 应用中实现跨不同顶级域的 SSO(单点登录) 方案,通常会面临浏览器同源策略(Same-Origin Policy)的限制。在同顶级域下,通过设置 Cookiedomain 属性可以轻松实现跨子域的认证。然而,在不同顶级域(例如 example.comexample.org)下,由于浏览器的安全策略,不同的顶级域不能直接共享 Cookie, 直接通过 Cookie 来实现跨域认证变得困难。

SAML(Security Assertion Markup Language) 是一种基于 XML 的开放标准,用于在不同的安全域之间交换身份信息。它主要用于 单点登录(SSO身份验证,特别是在企业环境中,通过 SAML 可以让用户在多个应用程序间共享身份认证信息。SAML 是由 OASIS(组织为先进信息系统)组织制定的标准,广泛应用于 Web 单点登录(SSO)以及跨组织的身份认证与授权。

SSO 是一个认证模式,而 SAML 是实现 SSO 的一种协议。SSO 是一个广泛的概念,指的是通过一次身份验证让用户在多个应用间无缝切换。它不仅限于某一个具体的协议或技术。SAML 是一种具体的协议,用于实现 SSO。它是一种 XML 基础的协议,虽然历史悠久,但在现代的 Web 和移动应用中,常常会使用其他更为灵活的协议,如 OAuth 2.0 + OpenID Connect(OIDC)

二、工作流


SAML SSO 架构如下:

  1. 身份提供者 (IdP Identity Provider): 比如 idp.example.com,是一个用于验证用户身份并提供认证信息的系统。它通常负责维护用户的认证信息(如用户名、密码、认证方式等),并生成有关用户的身份声明(Assertion)。 IdP 生成 SAML 断言,用于证明用户身份的消息。它通常以 XML 格式传输,并包含用户身份信息、认证方法、授权信息等内容。

  2. 服务提供者 (SP Service Provider): app.example.comportal.example.orgccc.example.xyz 等多个 Web 应用, 是使用用户身份信息的应用程序或系统。当用户尝试访问一个 SP 时,它会将请求重定向到 IdP 进行认证。

SAML SSO 流程如下:

1. 用户登录认证: 用户尝试访问受保护的资源(如 Web 应用 app.example.com),SP 会检查用户是否已经认证。如果用户尚未认证,SP 会重定向用户到 IdP 进行身份验证。用户被重定向到 IdP,通常是通过发送一个 AuthnRequest(认证请求)消息, AuthnRequest 消息包含了 SP 的信息以及请求的认证级别(如单因素、多因素认证)等, 附带必要的参数(如 client_idredirect_uriscoperesponse_type)。IdP 通过其认证机制(如用户名/密码、双因素认证等)验证用户身份。如果用户成功认证,IdP 会生成一个 SAML 断言(Assertion,该断言中包含关于用户身份的信息,通常包括:用户的唯一标识符(如 userIDemail)、认证方法(如 PasswordMFA)、认证时间戳、用户属性(如 roleemail 等)、SAMLSessionIDSAMLAuthToken 等。IdP 会将 SAML 断言(Assertion)通过 Response 消息返回给 SP, 并且 IdP 会创建全局会话, 并将相关信息写入到 IdP 域的 Cookie 中。此消息可以通过 HTTP POSTHTTP Redirect 的方式进行传输。SP 收到断言后,验证该断言的有效性。验证内容通常包括:确认断言是由可信的 IdP 生成的(通过签名验证), 验证断言是否在有效期内, 验证断言中的用户信息是否匹配。如果断言有效,SP 会根据断言中的信息创建本地用户会话(即局部会话),将相关认证信息写入到 SP 相关域中,并允许用户访问受保护的资源。

2. 用户后续请求验证: 当用户成功登录并通过 SP1 的认证后, SP1 会在用户的浏览器中设置一个 Session CookieSAML 断言 作为本地会话标识。这些信息通常会包含在浏览器的 Cookie 中,便于后续请求验证。在访问 SP1 下的受保护资源时,浏览器会自动带上 SAML AssertionSession CookieSP1 会通过这些信息验证用户是否已经认证。如果断言或会话有效,用户可以继续访问资源。

3. 跨服务提供者的认证: 用户访问 SP2 时,SP2 会检查用户的会话是否存在,判断是否已认证。如果用户没有有效的认证信息,SP2 会重定向用户到 IdP 进行认证。如果用户没有认证信息,SP2 会将用户重定向到 IdP 的认证端点,附带必要的参数(如 client_idredirect_uriscoperesponse_type)。此时,用户已经通过 SP1 认证并具有有效的全局会话(由 IdP 维护),所以 IdP 能够识别该用户并直接跳过登录界面。IdP 会检查用户的全局会话,确认用户已经认证。如果用户会话仍然有效(比如没有超时或被注销),IdP 会跳过登录过程,直接返回 SP2 需要的 SAML 断言。如果用户会话已过期或被注销,IdP 会要求用户重新登录。SP2 接收到 IdP 返回的 SAML 断言 后,验证其有效性, 如果 SAML 断言有效,SP2 会为用户创建本地会话,并将认证信息(如用户 ID、角色)存储在 SP2 的会话中(通常通过 Session Cookie)。

用户在 SP1SP2 之间的认证是通过 IdP 中的全局会话来完成的。SP1SP2 都依赖于 IdP 维护的用户认证信息、全局会话,但它们分别维护各自的局部会话。这种跨域、跨应用的认证机制即实现了 SSO(Single Sign-On),用户只需要在第一次登录时输入用户名和密码,后续的访问请求都会自动完成认证,无需再次登录。

用户登录成功之后,会与 IdPIdentity Provider,身份提供者) 及各个 SPService Provider,服务提供者) 建立会话,用户与 IdPIdentity Provider,身份提供者) 建立的会话称为全局会话,用户与各个 SPService Provider,服务提供者) 建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过 IdPIdentity Provider,身份提供者),全局会话与局部会话有如下约束关系

  • 局部会话存在,全局会话一定存在

  • 全局会话存在,局部会话不一定存在

  • 全局会话销毁,局部会话必须销毁