单点登录 (SSO):SAML、OAuth2、OIDC 简化

22-09-06 banq

在本文中,我们将了解单点登录 (SSO) 和 SSO 广泛使用的两种协议,即 SAML 和OAuth2。这是任何程序员都需要理解的复杂领域之一。

什么是单点登录?
单点登录 (SSO) 是用户可以使用一组凭据登录多个应用程序的过程。考虑到如今网站的数量以及其中大多数都要求进行身份验证,这是一个方便且高效的功能。我们都知道,我们无法为每个应用程序跟踪如此多的凭据集。SSO 来救援了!!!
用户无需一遍又一遍地建立身份,只需对用户进行一次身份验证,然后就可以访问多个不同的服务和应用程序。
一个这样的功能的例子是谷歌。只需一次登录,您就可以访问他们的所有服务,例如 Gmail、照片、云端硬盘等等。其他应用程序还允许用户使用 Google 登录进行身份验证,前提是他们的系统与 Google、Facebook 等身份提供商集成

SSO 的类型
提供 SSO 的标准和协议有很多,其中一些著名的是

  • 安全访问标记语言 (SAML)
  • 开放授权 (OAuth)
  • 开放 ID 连接 (OIDC)
  • Web 服务联合 (WS-Federation)
  • Kerberos

在本文的后面部分,我们将详细介绍 SAML、OAuth2 和 OIDC。

单点登录 SSO 的好处
SSO 有很多好处,如下所示

  • 降低访问第三方网站的风险
  • 减少为同一身份重新输入密码所花费的时间
  • 更简单的审计管理和使用
  • 更好的行政控制
  • 提高用户生产力
  • 更好的网络安全
  • 减少攻击面
  • 无缝且安全的用户访问


什么是 SAML(安全断言标记语言)?
SAML 是一种基于 XML 的标准,用于在 IdP 和服务提供商之间交换身份验证和授权数据,以验证用户的身份和权限,然后授予或拒绝他们对服务的访问权限。
SAML 是一种开放标准,已成为 SSO 的核心标准之一。SAML 使用身份提供者发送给服务提供者的称为断言(包含用户授权)的 XML 文档。
SAML 2.0 于 2005 年推出,并且仍然是该标准的当前版本。SAML 2.0 专门针对 Web 应用程序进行了优化,使信息能够通过 Web 浏览器传输


SAML 术语

  • IdP——身份提供者
  • SP - 服务提供商
  • 用户——使用系统访问服务提供商服务的用户

典型的 SAML 工作流由 IdP、SP 和用户组成。用户信息作为断言发送。 让我们假设用户有一个 Idp 帐户并拥有有效的凭据




让我们将上图分解为多个步骤,以便于理解

  1. 用户转到服务提供商并单击 SAML 登录
  2. SP 将请求重定向到身份提供者
  3. 身份提供者向用户显示登录页面以输入凭据
  4. 输入凭据后,SAML IdP 会验证其 Active Directory 或数据库中的凭据
  5. 验证后,SAML 响应会以 XML 格式发送带有断言,如上所示
  6. 然后用户将登录到应用程序


什么是 OAuth2?
OAuth 是比 SAML 更新的标准,由 Google 和 Twitter 于 2006 年开始联合开发。它的开发部分是为了弥补 SAML 在移动平台上的不足,并且基于JSON而不是 XML。OAuth2 广泛使用 JWT 令牌,因此比 SAML 更轻、更快。

在深入探讨 OAuth2 和 OIDC 之前,让我们先看看使用的术语
OAuth2 术语

  • 授权服务器——(例如:谷歌)
  • 资源服务器——(例如:Bitbucket)
  • 资源所有者——使用系统从资源服务器访问服务的用户(例如:Bitbucket 用户)

OAuth2 协议允许授权服务器在获得资源所有者(用户)的同意后向第三方应用程序颁发访问令牌这些访问令牌被 Bitbucket、Slack 等第三方应用程序用于访问资源提供的资源服务器。

如果您已注册新应用程序并同意从 Google/Facebook 等导入联系人,则您必须已经使用过 OAuth2。您可能使用了要求您在 Facebook/Instagram 等上分享您的帖子或照片的功能。这是OAuth2 协议,提供安全的委托访问,无需共享凭据
OAuth2 仅用于授权而不用于身份验证

什么是 OpenID Connect (OIDC)?
使用 OpenID,用户的凭据仅在浏览器路由请求后由授权服务器使用。验证后,将向用户颁发访问令牌,用户可以通过该令牌访问多个应用程序,而无需与每个应用程序共享其凭据。
如果您已使用 Google / Facebook / Twitter 登录名登录应用程序,则您必须已经使用过 OIDC。OpenID Connect 是组织用来验证用户身份的开放标准。

OIDC 用于对用户进行身份验证
将 OIDC 与 OAuth2 结合使用
OAuth 是一种开放标准的授权协议,用于授权用户,OIDC 用于验证用户。OIDC 位于 OAuth 2.0 之上,以添加有关用户的信息并启用 SSO 流程。它允许跨多个应用程序使用一个登录会话。例如,如下所示,您可以使用社交媒体登录来访问应用程序,而无需在应用程序中创建帐户

启用 OAuth2 和 OIDC 的示例登录页面




OAuth2 流与 OIDC 集成




上图解释了当您使用 Google 登录应用程序时发生的整个过程。步骤的数量可能看起来很复杂,但整个过程在几毫秒到几秒内结束。让我们一步一步地分解它。
假设用户已经有 Google 的登录帐户

  1. 用户进入 Bitbucket 页面登录
  2. 用户点击使用 Google 登录
  3. 浏览器将用户重定向到 Google 登录页面
  4. Google 显示凭据页面供用户输入凭据
  5. 用户输入谷歌凭据并点击提交
  6. Google 验证凭据并生成访问令牌并将其发送到浏览器
  7. 浏览器在Authorization Header中嵌入Access Token(Bearer Token),将用户的登录请求发送到BitBucket服务器
  8. Bitbucket 服务器将联系 Google 验证访问令牌并响应浏览器
  9. 现在用户登录到 Bitbucket 应用程序


何时使用 SAML 以及何时使用 OAuth2(使用 OIDC)
尽管 SAML 在企业设置中可能看起来更优越,但在某些情况下 OAuth 是有意义的。

  1. 政府应用程序的身份管理:政府数据的机密、敏感性质需要具有更强的安全性,而 SAML 将适合这种情况。例如:新加坡政府使用一个名为SingPass的基于 SAML 的系统作为其居民使用所有基于政府的服务的数字登录名
  2. 用户体验是重中之重:OAuth2 最适合用户体验,因为它在移动设备上运行良好。而且它很轻。
  3. 移动和消费者应用程序:OAuth2 在移动设备和消费者应用程序上运行良好,因为会话往往更短
  4. 虚拟桌面基础架构 (VDI) 实施:使用 SAML。VDI 将被企业内的许多员工使用。
  5. 资源需要临时访问:OAuth2 非常适合临时访问,因为它是为此目的而设计的

在本文中,我们看到了 SSO 的类型和优势。然后我们深入研究了两个著名的 SSO 协议,即 SAML 和 OAuth2。在探索OAuth2时,我们看到了 OAuth2 和 OIDC 之间的细微差别,然后看到了两者结合的用例。本文以哪些协议可用于某些用例结束。