Java SAML

2024 年 9 月 10 日 | 阅读 18 分钟

一般来说,所有用户都需要输入用户名和密码才能登录任何应用程序。否则,应用程序页面将不会打开。SAML 代表 安全断言标记语言。

要理解 SAML 是什么,我们需要知道 SSO 是什么。

SSO (单点登录)

单点登录 (SSO) 是一种系统,它允许用户使用一套凭据(即用户名和密码)安全地向多个应用程序和网站进行身份验证,只需登录一次。通过 SSO,用户尝试访问的应用程序或网站会在受信任的第三方进行验证,以确认用户身份。

没有 SSO 的身份验证如何工作?

没有单点登录,每个网站都会维护自己的用户及其凭据数据库。当我们尝试登录应用程序或网站时,就会发生这种情况。

  1. 网站首先检查我们是否已经过身份验证。如果已经过,它将允许我们访问该网站。
  2. 如果没有,它会要求我们登录,并将其用户名和密码与用户数据库中的信息进行比对。
  3. 登录后,当我们浏览网站时,网站会传递身份验证数据,以验证我们在每次访问新页面时都已通过身份验证。

身份验证数据通常以带有会话数据的 cookie 或不跟踪会话且处理速度更快的令牌的形式传递。

单点登录是三个实体之间的协议。

  1. 用户
  2. 身份提供者
  3. 服务提供者

用户

个人需要访问不同的服务,并且用户应该能够管理个人信息,例如他们的密码,这些密码应该是可唯一标识的。

身份提供者

“身份提供者”会告诉我们更多关于该用户的信息,它是不仅关于这个人是谁,还包括他们的角色是什么的真实来源——这些角色反过来会告知其他系统关于这个人被允许做什么。

服务提供者

服务提供者是传统应用程序,但它们可以包括各种产品和服务,例如WIFI接入、我们的电话或“物联网”设备,如智能锁或冰箱。

因此,服务提供者不应仅限于 Web 应用程序、API 或任何此类概念。

要创建单点登录体验,我们需要了解协议。

我们今天登录系统的三种主要方式是基本授权和基本的用户名和密码,而且我们一直都在这样做。

有三种主要协议

  1. 基本身份验证
  2. OAuth
  3. SAML

基本身份验证:一个简单的用户名和密码模式,按应用程序进行。

OAuth:API 安全模型依赖于外部身份提供者和密钥存储来授予和拒绝对 API 的访问。

SAML:一种基于 Web 的模型,允许第三方应用程序或服务验证用户身份并检索有关该用户的详细信息。

SSO 的优点

  1. 用户便利性
  2. 降低员工使用简单密码的风险
  3. 降低帮助台成本
  4. 轻松入职和离职

什么是 SAML?

SAML 是帮助我们实现 SSO 的协议之一。因此,它是安全断言标记语言,一种基于 XML 的协议,用于实现 SSO,它同时支持身份验证和授权。

什么是 SSO 令牌?

它是在 SSO 过程中,一个系统传递给另一个系统的信息或数据集合。

SSO 的数据将是用户的电子邮件地址以及发送令牌的系统的信息。在身份验证之前会先验证令牌,令牌接收者应该对其进行数字签名,以确认令牌是否来自真实来源。

数字签名证书在初始配置过程中交换。

让我们来了解一下 SSO 是否安全。

SSO 是否安全?

SSO 必须提高安全性,原因有很多。单点登录解决方案将修改和简化用户和管理员的用户名和密码管理凭据。正如我们所知,用户将不再需要跟踪许多用户名和密码,而是记住一个更复杂的密码。SSO 将帮助用户快速访问他们的应用程序。

SAML 及其工作原理

SAML 用于身份验证,它是一个开放标准。Web 应用程序在两个提供者之间基于可扩展标记语言 (XML) 传输数据,这两个提供者是身份提供者 (IDP) 和服务提供者 (SP)。

当我们想要简化身份验证过程时,技术行业创建了 SAML,以便用户能够访问许多独立 Web 应用程序。我们已经讨论过 SSO,单点登录,它依赖于仅存在于同一域中的 cookie。它使用身份提供者通过集中用户身份验证来实现上述场景。因此,Web 应用程序通过身份提供者使用 SAML 来授予用户访问权限。所以这告诉我们用户不需要记住他们的用户名或密码。它还通过提高平台安全性使服务提供者受益,主要是避免存储密码,并且在用户忘记密码时无需处理。

SAML 的好处

有很多好处,SAML 是一个被广泛采用的企业解决方案。主要地,它改善了用户体验,因为我们只需要登录一次即可访问多个 Web 应用程序。我们需要记住一套凭据并加快身份验证速度。

组织也将受益于此功能,因为可以减少与重置密码相关的帮助台电话。

SAML 除了改善用户体验外,还提供了增强的安全性。正如我们所知,身份提供者存储不会在其系统上存储用户凭据。除此之外,身份提供者专门提供安全的 SAML 身份验证。此外,它们还具有规模经济,可以投入时间和资源来实施多层安全性。

例如,IDP 拥有全面的身份安全解决方案,包括多因素身份验证 (MFA) 等内置功能,可防止常见的密码攻击。

SAML 的工作原理

正如我们所讨论的,SAML 通过在身份提供者和服务提供者之间交换有关用户的信息(如登录、身份验证状态、标识符和其他相关属性)来工作。它还简化和保护了身份验证过程,因为用户只需要登录一次并提供完美的身份验证凭据。访问网站时,身份提供者会将 SAML 身份验证传递给服务提供者。

除了服务提供者,组织在接受请求之前必须遵守我们的身份。

让我们考虑航空业的一个例子。在我们登机之前,航空公司会确认我们的身份,以确保其他乘客的安全。机组人员将通过我们的一些身份证件或任何政府颁发的带照片的身份证件来验证我们的身份。一旦我们确认姓名与机票上的身份信息相符,他们就会允许我们登机。

假设政府是身份提供者,航空公司是服务提供者。政府向我们的身份颁发了 SAML 断言。当我们申请政府 ID 时,我们需要填写一张带有我们照片的表格,在某些情况下,他们还会要求我们提供指纹。服务提供者(政府)将在其数据库中存储有关识别属性的信息,并向我们颁发带有我们身份的实体 ID。

在上述航空公司示例中,当我们到达登机口时,服务提供者(航空公司)会检查我们的 ID(SAML)断言。然后,航空公司会接受我们的 ID,因为它包含了与他们数据库中关于我们的信息匹配的详细信息。在所有这些手续完成后,航空公司将允许我们登机。如果任何信息不匹配,它将不允许我们登机。

什么是 SAML SSO?

SAML 单点登录是一个促进 SAML 的过程,它允许用户在登录身份提供者后,只需登录一次即可访问多个 Web 应用程序。SAML SSO 将使用户登录更快,从而改善用户体验。

从用户角度来看,SAML SSO 易于使用且更安全,因为他们只需要记住一套用户凭据。它还为每个站点提供快速无缝的访问,因为他们访问的每个应用程序都不会提示他们输入用户名和密码。

用户还可以登录身份提供者,通过单击 Web 应用程序提供的 URL 来访问他们相关的 Web 应用程序。

除了用户的好处之外,SAML SSO 还将提供额外的额外好处,例如提高帮助台和用户的生产力。现在,用户不必花费时间登录许多 Web 应用程序,每个网站都需要不同的凭据。此外,他们也不会尝试在帮助台中重置密码,而是让服务团队调查其他安全问题。

它提高了用户的满意度和生产力,SAML SSO 还有助于降低成本。例如,帮助台可以将类管理限制在特定范围内。他们不仅为自己的解决方案实现了身份验证,还可以订阅身份提供者,从而降低了内部构建劳动力和维护的成本。

OAuth

OAuth 在不同的项目中以不同的方式使用。OAuth 被称为授权,更重要的是,它最初是为了让一个服务授权另一个服务。

让我们举一个经典的相片打印服务的例子。我们一定见过一些网站,我们在那里提供图片和文件,然后付费让他们打印相片并寄到我们家。想象一下,如果我们正在开始一项新的相片打印业务,允许人们上传图片到我们的网站,然后他们可以订购这些相片的打印。我们必须对我们的网站进行编码,然后人们注册。现在没有人把照片保存在电脑上,他们会使用“云”。我们不断收到功能请求,例如“请添加 Google Drive 并导入 XYZ 功能”,以便用户能够从 Google Drive 导入他们的照片,然后直接在那里打印,而无需用户下载和重新上传。

我们需要连接到用户的 Google Drive 帐户并访问他们的文件才能从 Google Drive 导入。

我们需要解决服务代表用户相互访问的问题,为此创建了一个名为 OAuth 的标准,版本为 1.0,但当前版本是 OAuth 2.0,它是使用最广泛的版本。

OAuth 如何工作?

一个常用来帮助人们理解 OAuth 的类比是汽车的有效钥匙模式。我们听说过代客泊车,富翁开车到停车场,下车,然后把钥匙交给代客泊车员停车。

有些车配有一把额外的代客钥匙,就像主车钥匙一样,但访问权限较低。代客钥匙可以启动和停止车辆,但不能打开后备箱,也不能打开油箱。

这里车主使用了两项服务:车辆服务和代客泊车服务。代客泊车服务需要直接访问车辆服务来完成工作,而不是将车辆服务的完整凭据提供给代客泊车服务。车主不是将主钥匙交给代客泊车服务,而是通过提供代客钥匙来授予对车辆服务的减少或有限的访问权限。

这与 OAuth 的工作原理类似。OAuth 通常是一种授权机制,在获得我们许可后,服务可以代表我们相互授权。因此,它通常被称为委托访问。

OAuth 和 SAML 都是协议,我们使用它们来访问 Web 应用程序。主要区别在于我们使用 SAML 进行身份验证,使用 OAuth 进行授权。

让我们再次考虑航空公司技术,SAML 断言是乘客的 ID,而 OAuth 令牌是机票。航空公司将使用 ID 在允许乘客登机前验证他们的身份。一旦乘客登机,乘务员将检查乘客是否在飞机上,以确认他们是否在飞机上以及检查乘客的状态。

SAML 示例

SAML 使用基于声明的身份验证工作流程。当我们尝试访问一个站点时,服务提供者会要求身份提供者对用户进行身份验证。

然后,服务提供者使用身份提供者提供的 SAML 断言来授予用户访问权限。让我们通过一个例子来讨论。

  1. 用户打开他们的浏览器和一个 Web 应用程序,该应用程序导航到服务提供者并使用身份提供者进行身份验证。
  2. 当用户打开 Web 应用程序时,它会借助 SAML 请求响应用户。
  3. 之后,浏览器将 SAML 请求发送到身份提供者。
  4. 然后身份提供者将传播 SAML 请求。
  5. 身份提供者将通过提示输入用户名、密码或其他身份验证因素来验证用户。
  6. 如果用户已经过身份验证,身份提供者将跳过上述步骤。
  7. 然后身份提供者将生成 SAML 响应并将其返回给用户的浏览器。
  8. 在生成 SAML 响应后,浏览器会将响应发送到验证它的服务提供者的 Web 应用程序。
  9. 当响应验证成功时,Web 应用程序将授予用户访问权限。

SAML 如何工作?

正如我们所知,SAML 是一个开放标准,用于验证用户身份并提供身份验证。在任何软件场景中,员工都必须登录才能进行任何公司相关的活动,并获得访问公司内部功能的任何部分的权限。

当用户完成身份验证后,用户可以访问浏览器。Microsoft Office、intranet 和 SAML 将允许用户通过单个数字签名查看所有资源。

一些公司非常严格,SAML 只允许用户打开门或解锁电脑屏幕。在这种情况下,在执行任何操作(包括访问文件)之前都需要授权。

网络管理员将使用 SAML 从中央位置管理用户。一个密码可以解锁一个人所需的所有服务,并保护公司的安全。

SAML 工作流程如下

  • 请求:用户将点击“登录”按钮。
  • 验证:SAML 和身份提供者将连接进行身份验证。
  • 登录:用户将看到等待输入用户名和密码数据的屏幕。
  • 令牌创建:如果用户输入正确的信息,SAML 令牌将移至服务提供者,允许用户登录服务器。

因此,工作流程将允许服务提供者、浏览器和身份提供者持续地交换信息。用户不会注意到延迟,因为这个过程通常在几秒钟内完成。

OAuth 如何工作?

“auth”表示身份验证或授权,对于 OAuth 协议,我们特指批准。该协议用于将身份验证从一个服务传递到另一个服务,同时保护某人的用户名和密码。

有时,所有员工都可以跳过一种方法,即无需再次登录即可从一个应用程序移到另一个应用程序。OAuth 使所有这些成为可能。

让我们考虑一下拥有活跃 Google 账户的员工。这样他们就可以使用相同的凭据来访问找到的数据

  1. Microsoft 365
  2. Salesforce
  3. Box
  4. Hootsuite
  5. Marketo
  6. SurveyMonkey
  7. HotJar

员工必须需要这些基于 Web 的程序才能做好工作。但是同一个人可能会因为创建五个不同的用户名和密码而感到困惑。

重复用户名和密码会破坏软件的安全性。如果一个站点失败,用户的数据将在所有平台上暴露并变得易受攻击。当我们登录到另一个提供第一个验证的地方时,情况就大不相同了。

一些消费者会担心数据挖掘,并建议使用像 Facebook 这样的工具,因为它们拥有太大的权力。每当用户登录其他应用程序和网站时,Facebook 都会获得更多的消费者洞察。如果 Facebook 的数据被泄露,该用户的其他数据或登录信息也将失败。

大多数员工都很高兴并感谢能够在繁忙、压力大的时期节省时间。

OAuth 工作流程如下

  • 请求:用户将点击网页上的“登录”按钮。
  • 选择:客户端将选择要使用的第三方授权凭据。
  • 登录:授权令牌将创建令牌访问,该令牌将发送到资源服务器。
  • 连接:当令牌验证通过后,资源服务器将授予用户访问权限。

SSO 协议

主要有三种 SSO 协议。它们是

  1. 安全断言标记语言 (SAML)
  2. 开放授权 (OAuth)
  3. OpenID Connect (OIDC)

IT 管理员在制定保持数据和身份安全计划时,必须选择一个协议或框架进行部署,以保持联合身份。所以,他们将使用单点登录 (SSO)。

单点登录允许员工在网络上一次登录应用程序,而无需重复操作,因为根据研究,公司正在使用和部署 170 到 200 个应用程序。所以,想象一下,如果一名员工每次登录应用程序或需要访问它时都需要输入用户名和密码。

虽然员工使用单点登录无疑很方便,但 IT 管理员和 IT 安全团队使用单点登录进行身份和访问管理也非常方便。

正如我们所讨论的,有三个协议可供选择,因为这并不容易。因为排在前两位的是 SAML,即安全断言标记语言,以及 OAuth,即开放授权。

那么,让我们看看这些协议之间的区别,并推荐选择哪一个。

安全断言标记语言 (SAML)

SAML 是一种协议,它允许身份提供者(我们在此管理用户名)将用户凭据传输到服务提供者。同时,服务提供者是用户登录的应用程序。因此,一种协议允许身份提供者将凭据传输到服务提供者以进行身份验证和授权,这是 SAML 和 OAuth 之间的主要区别。

SAML 同时进行用户身份验证和授权;OAuth 仅用于授权目的。如果有人简化了密码管理并启用了 SSO,这将有助于企业,因为员工将使用越来越多的应用程序。

用户将请求服务提供者的资源,然后重定向用户到 SAML 登录页面,在那里他们输入用户名和密码。这些 SAML 身份提供者与后端用户数据库通信,用户凭据存储在那里。验证完成后,身份提供者会将 SAML 响应发送到服务提供者,用户便通过身份验证。

从开放授权的角度来看,最新的协议是 2.0。它通过将访问令牌授予第三方服务提供者而不暴露用户凭据来提供安全的委托访问。但是,它只授权用户,而不验证他们。对于身份验证目的,我们需要 Open ID Connect。为此,身份提供者或创建/管理身份的提供者使用 OIDC。用户可以首先使用他们的 IDP 或身份提供者登录,然后访问应用程序而无需登录和共享凭据。所以,正如我们所见,这主要是 SAML 使用的相同方法。

SAML 和 OAuth 之间的区别

SAML 专为身份验证和授权而设计,而 OAuth 仅为授权而构建。因此,令牌的使用方式与用户将存储为令牌的凭据集不同。SAML 令牌称为 SAML 断言;在 OAuth 中,它称为访问令牌。

从流程角度来看,当用户登录服务时,如我们之前演示的,第一步是使用 SAML 进行身份验证。然后服务提供者向 IDP 发出类似的身份验证请求,并像我们之前看到的那样将用户重定向到浏览器以进行 IDP 身份验证,因此从开放授权的角度来看,过程是相同的,除了没有加密,这是另一个区别。访问令牌没有加密,只授予授权,因此加密是另一个区别,因为 OAuth 协议没有令牌的加密。它完全依赖 SSL 或 TLS 来增加通信安全性。

主要区别在于令牌、流程和加密。所以,这告诉我们在什么时候使用 SAML 而不是 OAuth。

使用开放式身份验证或授权是好的。

OAuth 的基本示例

让我们举一个实际的例子来说明这个协议。假设我们有一个客户端和一个服务器。当客户端向服务器请求时,服务器会将其返回到授权码,然后客户端使用该授权码。因为这个代码被发送到服务器,然后服务器返回访问令牌,借助这个访问令牌,用户就可以访问 API 并请求用户的个人资料信息。

使用的术语

让我们谈谈上例中使用的内容。

  • 授权码
  • 范围
  • 重定向 URL
  • 访问令牌

授权码

如果某个用户有很多账户,如果我们选择特殊报告,并借助此授权码,我们可以允许特定的信息范围。

我们也可以说它是在请求一些范围信息,这是 OAuth2 的第一步。用户还将授予访问某些可用范围的权限。范围只不过是我们的应用程序与用户交换的信息类型。此授权码用于交换访问令牌,服务器授予应用程序访问令牌。所以,这都是关于授权码。

OAuth2 中的范围

范围是应用程序请求的信息类型。它是应用程序要访问的数据,并且该应用程序以范围的形式请求,并且以范围的形式请求,存在读取数据的读范围,以及可以写入应用程序数据的写范围。

OAuth2 中的重定向 URL

服务器分配重定向 URL。它有助于在后端检查应用程序是否有效,此 URL 在服务器端生成,然后服务器将用户重定向到此 URL。所以,这都是关于重定向 URL 的。

客户端 ID 和客户端密钥

这是在创建一两个应用程序之前必须设置的信息的一部分。这两个是独特的信息,我们想把它们存放在任何地方。

访问令牌

服务器生成访问令牌,我们可以使用此访问令牌来请求 API,请求个人资料信息。此外,我们还可以看到它正在请求个人资料信息,服务器会发送它;这是最重要的,借助它,我们可以探索 API,或者我们可以请求个人资料信息或用户数据,在这种情况下,显示图片将显示请求的电子邮件 ID、出生日期等等,借助访问令牌。

JavaScript 实现

首先,我们必须创建客户端 ID 和客户端密钥。这非常简单

  • 转到 Google 开发人员控制台并创建一个新项目。
  • 转到库。
  • 创建凭据。
  • 点击 OAuth 客户端 ID。

初始化 Javascript SDK

我们必须初始化 Javascript 来进行 OAuth。所以,我们必须包含脚本标签——第一件事是包含 Google Javascript SDK 在我们的网页上。

OAuth2 和 SAML 的比较

正如我们所知,SAML 支持单点登录并通过属性查询路由提供授权。而 OAuth 侧重于授权,即使它侧重于身份验证角色,例如,在使用 Instagram 或 Facebook 帐户等社交媒体登录时。OAuth 不支持单点登录 (SSO)。

从正式的意义上讲,SAML 被定义为令牌格式;加密非常复杂,交换的消息大小很大。在 OAuth 方面,它不使用任何消息加密;它依赖 HTTPS 并且不定义任何令牌格式。

OAuth2 的优势在于使用和灵活性,它被用于移动设备、智能电视等智能设备、Web 应用程序等。有许多库可促进与许多客户端类型和服务提供者的集成。SAML 的设计并未考虑这些新技术,因此在这些系统上使用起来更具挑战性。它主要与传统 Web 应用程序一起使用。

OAuth 还允许一个服务访问另一个服务,而无需提供任何登录凭据,OAuth 通过允许我们再次使用我们的凭据来实现这一点。如果我们使用 Gmail 地址登录 Office.com,那么我们正在使用 OAuth。

我们也可以同时使用 SAML 和 OAuth。客户端或用户将从 IDP 获取 SAML 断言,并请求授权服务器授予对资源服务器的访问权限。授权服务器将验证用户身份,并将 OAuth 令牌通过 HTTP 标头返回,以访问受保护的资源。


下一个主题Java 中的 SonarQube