SAML 和 OIDC 之间的区别是什么?
在本文中,我们提供了 SAML 和 OIDC 协议的概述,以及它们的典型认证流程。我们比较了每个协议的显著差异、优缺点。此外,我们基于潜在的用户场景,提供了关于如何在这两种协议之间做出选择的指导。
OpenID Connect (OIDC) 和 安全断言标记语言 (SAML) 是认证协议,允许身份提供者 (IdPs) 实现用户认证和访问控制。每个协议定义了其自身的机制来维护已认证用户的身份,然后使用该身份授予或拒绝对受保护应用的访问。
什么是 SAML 和 OIDC?
IdP 维护用户身份信息的数据库。服务提供者 (SP) 倚靠这些信息来认证用户,有时甚至允许单次认证用于多个应用程序(单点登录)。OIDC 和 SAML 是定义这些用户身份相关信息如何在这两个主体之间流动的标准。它们的最终目标是相同的:用户认证。然而,达成这一目标的基本方法不同。
SAML
自 2005 年起,SAML 2.0 是当前标准的版本。它使用 XML 格式化身份信息、请求和响应。XML 是一种成熟的标准,用于以方便人类和计算机理解的方式格式化文档。为了传输或接收 XML 编码的信息,它使用基本的 SOAP 或 HTTP 请求。根据 SAML 协议定义,请求身份信息的服务称为服务提供者 (SP)。
在我们介绍典型的 SAML 认证过程之前,我们需要了解 SAML 认证所依赖的要素。在 IdP 和 SP 识别彼此并完成认证过程之前,它们需要 "交换" 必要的信息,通常通过 XML 格式的元数据实现。交换的信息包括:
- 公钥,IdP 和 SP 生成它们各自的私钥和公钥对并交换这些密钥以签署或加密通信。随着网络通信安全性的进步,许多场景现在只需要请求签名,而省略了加密步骤。
- 端点,用于 SP 将 SAML 认证请求发送到 IdP,并用于 SP 接收 IdP 对认证请求响应的 SAML 断言。
- 支持的 XML 属性格式,用于 IdP 在完成认证后将所需的用户信息传输给 SP。
一旦 IdP 和 SP 知晓上述信息,它们就可以进行授权过程(典型的 SP 发起认证流程):
OIDC
OIDC 是一种增强了 OAuth 2.0 框架的现代协议。它使用基于 JSON 的 Web 令牌 (JWT) 来构建数据负载。JWTs 是一种已确立的行业规范,设定了在实体之间安全交换和表示声明的准则。这些声明主要是加密的用户数据,是身份验证和管理所必需的。OIDC 主要使用普遍的 HTTPS 进行数据传输。
众所周知,OIDC 协议支持多种不同的流程,包括授权码流程、隐式流程和混合流程。在接下来的示例中,我们将介绍其中最安全、最典型的流程:授权码流程。这也是 Logto 使用的流程。
OIDC 和 SAML 的独特方面
- 由于开发时间较晚,OIDC 更适合现代应用程序认证,相比之下 SAML 标准较老。
- 历史上,SAML 比 OIDC 更早出现,并已集成到许多已建立的企业系统中。
- 与 SAML 庞大的 XML 文档不同,OIDC 的 JWTs 更紧凑且更易于处理。
- 配置 OIDC 通常比 SAML 更简单。
- OIDC 的一个关键特点是其定义的“范围”,允许 IdPs 管理各种权限。应用程序可以向 IdP 请求特定权限,用户批准后授予。这一 OIDC 特性为 IdP 提供精细的权限控制。
如何选择 OIDC 和 SAML?
OIDC 和 SAML 都是强大的认证系统,各有其独特的优势。选择取决于你组织的具体需求。
- 对于快速和高效的身份平台部署,OIDC 优于 SAML。实现 OIDC 更简单,避免了 SAML 在元数据解析、认证请求处理和 SAML 断言分析方面复杂的 XML 处理。
- OIDC 适用于拥有大量 API 交互和复杂权限机制的环境,提供了更灵活和高效的权限控制以及更优的开发者体验。
- 在与已经基于 SAML 的系统集成时,选择 SAML 确保系统互操作性更顺畅,并减少连接不同协议所需的努力。
市场上有哪些好的解决方案?
Logto 是开发者中受欢迎的身份解决方案,最近推出了企业 SSO 功能。它为 SAML 和 OIDC 协议提供支持,以及与像 Google Workspace 和 Microsoft Entra ID(前身是 Azure AD)等主流 IdP 的开箱即用集成。借助 Logto 你可以绕过自行实现 SSO 的复杂性。通过几个简单的配置步骤,你就可以在你的身份系统中启用 SSO 支持,让你选择适合你业务需求的协议。