IdP 發起的 SSO vs SP 發起的 SSO
了解 IdP 發起的 SSO 和 SP 發起的 SSO 之間的差異,以及為什麼 SP 發起的 SSO 更加安全。
IdP 發起的 SSO vs SP 發起的 SSO
术语
- 身份提供者 (IdP): 存储和验证用户身份的服务。
- 服务提供者 (SP): 向用户提供服务的网站或服务。
- 单点登录 (SSO): 一种会话和用户身份验证服务,允许用户使用一组登录凭据(例如,名称和密码)访问多个应用程序。
- SAML: 安全断言标记语言是一种开放标准,用于在各方之间交换身份验证和授权数据,特别是在身份提供者和服务提供者之间。它是 SSO 常用的协议。一旦用户成功通过 IdP 验证,IdP 会向 SP 发送 SAML 断言,SP 验证该断言并授予用户访问权限。
- OIDC: OpenID Connect 是一种更现代和更安全的 SSO 协议。它构建在 OAuth 2.0 之上,提供了一种根据 IdP 执行的身份验证来验证用户身份的方法。一旦用户成功通过 IdP 验证,IdP 会向 SP 发送 JWT 格式化的令牌,SP 验证该令牌并授予用户访问权限。
SP 发起的 SSO
正如其名称所示,SP 发起的 SSO 是由服务提供者启动的。用户通过访问 SP 网站上的资源开始身份验证过程。然后,SP 将用户重定向到 IdP 进行身份验证。一旦用户通过验证,IdP 生成一个令牌 (OIDC) 或 SAML 断言 (SAML),并将其发送回 SP。SP 验证令牌或断言并授予用户访问权限。
- 用户访问 SP 的网站并尝试访问资源。
- 用户点击 SSO 提供者的登录按钮(例如 Google、Azure AD、Okta 等)。
- SP 将用户重定向到 IdP 进行身份验证。
- 用户登录到 IdP。
- IdP 将令牌或断言发送回 SP。
- SP 验证令牌或断言并授予用户访问权限。
IdP 发起的 SSO
与 SP 发起的 SSO 不同,IdP 发起的 SSO 是由身份提供者启动的。用户从 IdP 的网站开始身份验证过程。通常,用户会在 IdP 的门户上找到支持的 SP 应用程序列表。用户点击 SP 应用程序后,会被重定向到 SP 的网站,并带有预验证的身份。
- 用户登录到 IdP。
- 用户访问 IdP 的门户并选择一个 SP 应用程序。
- IdP 验证用户的当前会话,并将用户重定向到具有预验证 SSO 身份的 SP。
- SP 验证 SSO 身份并授予用户访问权限。
Idp 發起的 SSO vs SP 發起的 SSO
IdP 发起的 SSO 与 SP 发起的 SSO 的优势
IdP 发起的 SSO 更常被大型企业和依赖于各种第三方应用程序或服务的组织采用。例如 Workday、Salesforce 等。它提供了一种集中管理用户访问多个应用程序并强制执行 SSO 身份验证的方法。通过启用 IdP 发起的 SSO,员工可以直接从 IdP 的门户访问连接的应用程序,无需访问每个应用程序的网站,从而减少入职时间并改善用户体验。
IdP 发起的 SSO 与 SP 发起的 SSO 的风险
与 SP 发起的 SSO 相比,IdP 发起的 SSO 存在更多风险。
-
缺乏身份验证上下文: 从 IdP 发起的所有身份验证请求都是未经请求的。因此,SP 发起身份验证过程,可能打开未经授权访问的大门。存在用户会话可能被劫持的风险。恶意行为者可能在用户不知情或未经用户同意的情况下为其发起登录过程。
-
会话固定: 由于 SP 没有发起身份验证过程,用户的会话可能固定到 IdP 的会话。这可能导致会话固定攻击,攻击者可以将用户的会话固定到 IdP 的会话,并获得未经 授权的访问用户帐户的权限。
-
钓鱼攻击: IdP 发起的 SSO 可能容易受到钓鱼攻击。恶意行为者可以欺骗用户访问虚假的 IdP 门户并窃取用户的凭据。一旦用户登录,攻击者可以将用户重定向到具有预验证身份的 SP。
-
没有请求验证的保证: 在 SP 发起的 SSO 中,通常 SP 会在请求中包含必要的安全信息,以保持请求的完整性。SP 收到身份验证响应后,将验证这些信息以防止任何 CSRF 攻击。例如:OIDC 中的
state
参数和 SAML 中的RelayState
。然而,在 IdP 发起的 SSO 中,SP 未发起身份验证过程,因此 SP 无法对请求验证提供保证。
IdP 发起的 SSO 与 SP 发起的 SSO 的限制
由于上述漏洞,OIDC 不支持 IdP 发起的 SSO。OIDC 要求 SP 发起身份验证过程,以确保请求的完整性。即使在用户从非 SP 的第三方启动身份验证过程的情况下,用户也应首先被引导至 SP 以启动身份验证过程。
但在 SAML 中,IdP 发起的 SSO 是可行的。IdP 可以在不通过 SP 发起身份验证过程的情况下生成 SAML 断言。在 SAML IdP 发起的 SSO 中,可以直接向 SP 的 ACS URL 发送没有合适 RequestID
和 RelayState
的 SAML 断言。SP 应能够处理这种断言并授予用户访问权限。(注意:没有 RequestID
和 RelayState
,SP 无法保证请求的完整性)。
结论
尽管 IdP 发起的 SSO 提供了一种集中管理用户访问多个应用程序的方式,但与 SP 发起的 SSO 相比,它存在更多风险。SP 发起的 SSO 更加安全,并提供了对身份验证请求完整性的更多保证。建议对基于 OIDC 和 SAML 的 SSO 使用 SP 发起的 SSO。