第11章_对用户进行身份验证

对用户进行身份验证

在前面的章节中,您学习了如何管理用户。您还演练了涉及用户在 Keycloak 中进行身份验证的示例。到目前为止,您应该知道设置 Keycloak 以立即验证您的用户是多么容易,但身份验证不仅仅是使用登录页面和要求用户输入密码。

Keycloak 有一组定义明确的流程,代表最终用户和客户端(参与者)在对领域进行身份验证时如何与服务器交互。对于最终用户,这些流程通常涉及使用浏览器作为中介,对于客户端,步骤基于对令牌端点的反向通道请求。

正如您在前几章中学到的那样,向领域进行身份验证的最终用户将看到一个登录页面。在此页面上,用户可以与服务器启动不同的交互式流,以便:

  • 自行注册到 Realm 领域

  • 认证

  • 重置密码

对于这些流程中的每一个,Keycloak 都提供了一个内置的、随时可用的流程定义,其中包含了用户在与领域进行交互时应遵循的最常见步骤,无论在这些流程中的任何一个流程中都是如此,同时仍然允许你创建自己的定义,以更好地满足你的自注册、身份验证和密码恢复需求。

在本章中,我们将仔细研究如何管理身份验证流程,以及如何通过利用双因素身份验证(2FA)和多因素身份验证(MFA)来实现对领域的强身份验证。

为此,您将了解可以选择用于对用户进行身份验证的不同类型的凭证,以及它们如何协同工作以提高系统的整体安全性。

在本章中,我们将介绍以下主题:

・了解身份验证流程

・使用密码

・使用一次性密码 (OTP)

・使用 Web 身份验证 (WebAuthn)

・使用强身份验证

技术要求

在开始之前,请在此领域中创建一个 myrealm 领域和一个名为 alice 的用户。

在接下来的几节中,我们将使用 Keycloak 帐户控制台通过不同的身份验证策略对 alice 进行身份验证。

查看以下链接,观看 Code in Action 视频:https://packt.link/iuHcj

了解身份验证流程

身份验证流程由一系列顺序步骤或执行操作驱动,这些步骤或执行操作组合在一起,用于定义用户和客户端的身份验证方式。

Keycloak 在如何在身份验证流定义中安排执行方面非常灵活。默认情况下,领域是使用内置定义创建的,这些定义涵盖了安全地对最终用户和客户端进行身份验证的最常见步骤,您可以随时更改或扩展这些定义以满足自己的身份验证要求。

为了更好地理解这一点,让我们看一下 “myrealm” 领域的可用身份验证流定义。为此,请打开管理控制台并点击左侧菜单中的 “身份验证” 链接。

在这里插入图片描述
图 11.1:身份验证流定义

在这个页面上,你有所有可用的流程定义列表,以及它们如何与 Keycloak 支持的不同流程绑定。一个定义所绑定的流程由该列表中的 “Used by” 列指示。

在身份验证上下文中,您可以配置以程:

  • Browser flow(浏览器流程)

  • Direct grant flow(直接授权流)

  • Client authentication(客户端身份验证)

浏览器流程与最终用户如何使用浏览器进行身份验证有关。每次最终用户在 Keycloak 中进行身份验证时,都会执行与此流程相关的定义中的步骤。如前面的屏幕截图所示,当你通过浏览器对用户进行身份验证时,浏览器身份验证流程定义中的所有步骤都将被执行。

直接授权流和客户端身份验证流也是如此。然而,这两种流与客户端在领域中如何进行身份验证(客户端身份验证流)或者当客户端对用户进行身份验证时(直接授权流)有关,它们使用反向通道请求在令牌端点获取令牌。

虽然本章重点介绍用户和客户端身份验证过程中涉及的流程,但在配置自助注册(注册流程)或重置密码(重置凭证流程)时,同样的概念也应适用。

配置身份验证流程

Keycloak 允许您通过直接更改其相应的定义或使用现有定义作为模板创建自己的定义来配置身份验证流。

创建流定义最简单且推荐的方法是通过复制现有流定义将其用作模板。这样做的原因是,您可以轻松回滚更改并切换到用作模板的定义,以防流程被您的更改破坏。

让我们快速了解一下如何自定义浏览器流,并看看它如何影响在领域中使用浏览器进行身份验证的最终用户。为此,打开browser,然后通过从右上角的操作菜单中选择 “Duplicate” 来创建一个新流程。系统应该提示你为新流选择一个名称。让我们将其命名为 “My Browser”,然后点击 “确定” 按钮以创建一个新流。
在这里插入图片描述
图 11.2:从内置浏览器流创建新的流定义

身份验证流定义是一个分层树,包含不同的身份验证执行(身份验证步骤)以及其他身份验证流定义(也称为子流程)。

身份验证执行是在对参与者进行身份验证时执行某些作的实际步骤。这些作可能与从参与者处获取一些输入有关(例如,在使用浏览器时仅要求最终用户提供其用户名),或者使用特定的身份验证机制和凭证(如密码)对参与者进行身份验证。

身份验证流定义中的元素从上到下按顺序执行。关于是否应执行流程中的下一步的决定取决于当前步骤的结果及其设置。

  • 当某个步骤标记为 REQUIRED 时,它必须先成功完成,然后才能移动到下一个步骤。如果所需步骤成功完成,则当流程中没有其他必需的步骤时,流程将停止。

  • 另一方面,当某个步骤标记为 ALTERNATIVE 时,即使该步骤未成功完成,流程也可以继续,以便其他步骤有机会成功执行其作。

对于子流程,REQUIRED 和 ALTERNATIVE 设置分别与流程中的所有必需执行或任何执行是否成功完成相关。

以 My Browser 流程定义为例,鉴权定义如下:

  1. 首先,如果请求中存在映射到有效用户会话的 Cookie,则 Cookie 执行会尝试无缝地重新验证用户。换句话说,如果用户之前已对领域进行身份验证,请不要尝试对用户进行身份验证。此步骤标记为 Alternative,表示如果无法在此步骤中对用户进行身份验证,则流程将继续。

  2. 如果启用了 Kerberos 执行,请尝试使用任何 Kerberos 凭证对用户进行身份验证。请注意,默认情况下,此执行处于禁用状态。

  3. Identity Provider Redirector 检查领域是否已配置为自动将用户重定向到预定义的身份提供者。它也被标记为 Alternative; 不完成此步骤将继续该流程。

  4. My Browser Forms是一个子流程,它对使用基于密码的身份验证和可能的 OTP 的 2FA 对用户进行身份验证的特定步骤进行分组。请注意,此步骤标记为 Alternative,因此如果前面的任何步骤成功完成,则不会执行该步骤。否则,用户将被迫再次提供其凭证,即使他们已经通过身份验证。

  5. 子流程的第一步是使用 Username Password Form 执行,一步中使用用户名和密码对用户进行身份验证。这是您在对领域进行身份验证时看到的登录页面。请注意,此步骤必须成功完成,因为它被标记为 Required。

  6. 如果上一步成功 – 用户最初已经过身份验证 – 那么还有另一个名为 My Browser Browser – Conditional OTP 的子流程,用于检查是否应该使用 OTP 执行 2FA。在此子流中, Condition – User Configured 是否设置了 OTP 凭证,如果是,则执行OTP Form步骤以使用其 OTP 对用户进行身份验证。

现在,让我们使用 Identifier First Login 流程更改用户在领域中的身份验证方式。在这种情况下,用户名和密码是通过不同的步骤收集的,而不是使用单个登录页面同时要求两者。为此,请单击用Username Password Form右侧的垃圾桶图标以删除执行。目前,您的流程应如下所示:
在这里插入图片描述
图 11.3:从流程中删除用户名密码表单执行

现在,让我们向此流程添加两个步骤,询问用户的用户名,然后询问他们的密码。为此,请单击 My Browser Forms 子流右侧的加号图标,然后单击 Add step。

完成此作后,您应该被重定向到一个页面,您可以在其中选择要作为子流的一个步骤包含的身份验证执行:
在这里插入图片描述
图 11.4:选择身份验证执行

在此页面上,您应该能够从大量身份验证执行中进行选择。在本例中,我们将从列表中选择 Username Form,然后单击 Add 按钮,将执行添加到 My Browser forms 子流。

将执行添加到流后,您应该会在子流中看到它。默认情况下,执行会添加到流的底部,但在本例中,我们希望此执行位于子流的顶部,以便我们可以先获取用户名。为此,请单击 Username Form 左侧的图标,然后向上拖动该步骤,直到它成为子流中的第一个执行。

执行您之前执行的相同步骤,将密码表单身份验证执行添加到子流中,以获取密码并对用户进行身份验证。确保 Password Form 是子流中的第二个执行。

让我们确保 Username Form 和 Password Form 执行都标记为 Required。为此,请单击 Required设置每个身份验证执行。这是一个重要的步骤,因为它迫使我们的最终用户在登录到 Realm 时提供这两条信息。

现在,My Browser 身份验证流程应如下所示:
在这里插入图片描述
图 11.5:My Browser 身份验证流程的最终配置

最后,您需要确保将 My Browser 流定义分配给 Browser 流。为此,请单击页面右上角的 Action 按钮,然后单击 Bind flow。将显示一个模式对话框,用于选择要将 My Browser 流定义绑定到的流。确保选择 Browser flow 并单击 Save 按钮。

在这里插入图片描述
图 11.6:将 My Browser 身份验证流定义绑定到浏览器流

现在,让我们尝试以 alice 身份登录 Keycloak 帐户控制台。为此,请在 http://localhost:8080/realms/myrealm/account 中打开浏览器并使用您的用户凭据登录。在对领域进行身份验证时,您应该注意到用户的用户名和密码是通过多个步骤获取和验证的。

在本节中,您了解了身份验证流的主要方面。您了解了 Keycloak 允许您通过创建或更改身份验证流定义来自定义用户和客户端的身份验证方式。您还了解到,通过利用身份验证流程,您可以调整 Keycloak,使其符合您的身份验证要求。

在接下来的几节中,我们将了解 Keycloak 支持的不同身份验证方法。

使用密码

在前面的章节中,您基本上是使用密码来验证用户。您还很快了解了在管理用户时如何设置密码。在本节中,我们将仔细研究基于密码的身份验证的工作原理以及如何管理密码。

我们不打算在这里介绍用户如何使用密码进行身份验证,因为您已经熟悉这一点,但我们将介绍有关这种身份验证形式的其他详细信息。

基于密码的身份验证可能是对用户进行身份验证的最常用方法之一。它易于实现,并且是大多数最终用户在需要对系统进行身份验证时所习惯的。但是,这种凭证类型的简单性有一些缺点和缺点,我们将在本节后面介绍所有这些。

为了帮助我们克服基于密码的身份验证的一些缺点,Keycloak 依靠常见的最佳实践来确保密码在传输过程中和静止时都是安全的。它还允许您定义策略,以便您可以管理密码管理的一些关键方面,例如到期时间、密码格式以及有关重复使用以前密码的策略。

密码是您可以为用户设置的最简单的凭据类型,默认情况下,Keycloak 使用它来验证用户。密码是按用户管理的,如您在上一章中学到的那样。在 User details (用户详细信息) 页面上,有一个 Credentials (凭据) 选项卡,其中提供了重置和删除用户密码所需的一切:
在这里插入图片描述

图 11.7:管理用户口令

Keycloak 使用强密码哈希算法来防止暴力攻击,以及安全地存储密码。Keycloak 使用的默认哈希算法是 PBKDF2,这是一种众所周知且广泛使用的算法,用于保持静态密码的安全。

每当你为用户设置密码时,它的值都会与一个安全的随机数(也称为盐salt)相结合,然后进行多次哈希处理(迭代次数),以创建难以破解的派生密钥。存储时,密码绝不会是明文格式。相反,派生的密钥与必要的元数据一起存储,以便之后验证密码。Keycloak 已预先配置为使用 HMAC-SHA-256 对密码进行哈希处理,迭代计数为 27,500。您应该能够使用更强大的哈希算法(如 HMAC-SHA-512)或在配置密码策略时更改迭代次数,我们稍后将看到这一点。

PBKDF2 算法在 CPU 方面成本高昂。根据您可用于 Keycloak 的 CPU,它可能会影响其性能和整体响应时间。确保根据您的要求更改迭代次数,以便在性能和安全性之间取得平衡。在撰写本书时,OWASP 建议至少进行 600,000 次迭代,具体取决于所使用的哈希算法。

基于密码的身份验证并不是对用户进行身份验证的最安全方法,因为有一长串与之相关的弱点。仅举几例,密码通常会被盗或泄露,容易受到网络钓鱼攻击,有些用户根本不关心他们的密码有多强,使您的系统与用户定义、保留和使用密码的方式一样安全。用户通常在不同系统上使用相同的密码这一事实也使您的系统与此链中最弱的系统一样安全。在可用性方面,当使用策略强制用户使用强密码时,它们会变得更大、更复杂,这使得它们在用户向系统进行身份验证时难以记住甚至难以键入,从而影响整体最终用户体验。

Keycloak 可帮助您提高基于密码的身份验证的整体安全性,但它并不能解决所有此类问题。单独使用密码时,密码只是验证用户身份的一个因素,因此您应该考虑使用其他因素来提高系统的整体安全性。正如我们将在接下来的部分中看到的那样,基于密码的身份验证并不是您在 Keycloak 中对用户进行身份验证的唯一选项,它允许您通过组合其他形式的身份验证甚至完全删除密码来对系统进行强身份验证。

在本节中,您了解了如何在 Keycloak 中管理密码的关键方面。您还了解到 Keycloak 依靠常见的最佳实践来确保密码安全,并且您还可以使用策略来控制密码管理的不同方面。

在下一节中,您将了解 Keycloak 如何允许您配置密码策略以使用更强的密码。

更改密码策略

Keycloak 允许您为密码定义不同类型的策略。可以通过单击左侧菜单上的 Authentication 链接,然后单击 Policies 选项卡来创建这些策略:
在这里插入图片描述
图 11.8:口令策略设置

在此选项卡中,您可以从不同的策略中进行选择并管理密码管理的特定方面,例如:

  • 强制密码中特殊字符、数字以及小写或大写字符的数量。

  • 定义最小长度。

  • 定义过期时间。

  • 避免在密码中包含用户的用户名。

  • 定义黑名单词典。

  • 避免重复使用以前的密码。

您可以通过单击 Add policy (添加策略) 选择框,然后选择要创建的策略,轻松创建这些策略中的任何一个。

有关 Keycloak 中可用的每个策略的详细说明,请查看 https://www.keycloak.org/docs/latest/server_admin/#_password-policies上的文档。

通过利用密码策略,您应该能够通过强制实施更强的密码并控制密码的更新频率来克服基于密码的身份验证的一些弱点。您应该能够轻松定义密码规则,例如避免在密码中包含其用户名、强制使用特定数量的特殊字符、小写字符和大写字符、强制使用最小长度等。

在本节中,您了解了 Keycloak 允许您使用不同类型的策略来控制密码管理的不同方面。

在下一节中,我们将了解可用于重置用户密码的不同选项。

重置用户密码

Keycloak 允许您使用不同的策略重置用户的密码。作为管理员,您可以使用管理控制台为用户选择密码,或强制用户在登录时更新其密码。用户还应该能够在登录页面上或通过 Keycloak 帐户控制台管理其帐户时重置其密码。

当您通过管理控制台更改用户的密码时,Keycloak 默认将新密码标记为临时密码。临时口令意味着用户下次尝试登录到某个领域时,必须提供新口令。

您可以通过在创建或重置用户密码时打开 Temporary (临时) 开关来控制管理员设置的密码是否为临时密码。如果您关闭此设置,则系统不会要求用户在登录时更改其密码。

临时密码只不过是设置用户强制更新密码所需作的快捷方式。管理员可以随时设置 Update Password required 作,以强制特定用户更新其密码:
在这里插入图片描述
图 11.9:使用 “更新口令” 作强制用户更新其口令

从用户的角度来看,可以通过转到 Keycloak 帐户控制台或在登录页面上启动特定流程来更新密码。

在帐户控制台中,用户可以通过在 Signing In (登录) 页面上单击 Update (更新) 按钮来更改其密码:

在这里插入图片描述
图 11.10:使用账户控制台更新密码

如果用户忘记或丢失了密码,他们可以启动特定流程以在登录页面上重置密码。默认情况下,此流处于禁用状态。要启用它,请单击管理控制台左侧菜单上的 Realm Settings 链接,然后单击 Login 选项卡。在此选项卡上,打开 Forgot password (忘记密码) 设置。登录页面上将出现一个链接,用户可以单击该链接来重置其密码:
在这里插入图片描述
图 11.11:更改领域设置以允许用户重置其口令

当此设置启用时,用户应在登录页面上看到 “Forgot Password? ” 链接。

在这里插入图片描述
图 11.12: 忘记密码?登录页面上的链接

点击后Forgot Password? 链接,系统会要求用户提供其用户名或电子邮件,以便他们可以通过电子邮件接收用于重置密码的链接。

请注意,此流程基于电子邮件验证,其中用户应具有与其账户关联的有效电子邮件地址。您的领域还应配置为使用您首选的 SMTP 服务器发送电子邮件。有关如何设置 SMTP 服务器的更多详细信息,请查看

在本节中,我们介绍了管理密码的不同方法。您了解了管理员可以设置密码,并且用户可以在对领域进行身份验证时强制更新其密码。您还了解到,用户可以分别通过账户控制台或登录页面更改或重置密码。

此外,我们还为您提供了有关基于密码的身份验证在 Keycloak 中如何工作的更多详细信息。您了解了 Keycloak 如何保持静态密码的安全,以及它如何帮助您使用强密码并通过利用密码策略控制密码管理的不同方面。最后,您了解到,基于密码的身份验证只是可用于对用户进行身份验证的可用选项之一,而不是最安全的。

在下一节中,我们将了解如何通过组合密码和 OTP 来启用 2FA 来更安全地验证用户。

使用 OTP

作为额外的安全层,Keycloak 允许您在对用户进行身份验证时使用第二个因素或证据。除了提供密码(用户知道的东西)之外,用户还有义务提供有关其身份的辅助证据(他们拥有的东西),可以是他们拥有的代码或安全密钥。

OTP 可能是为用户帐户启用 2FA 的最常见方法之一。它相对易于使用,并在您对用户进行身份验证时增加了额外的安全层。

虽然它是 2FA 的有用方法,但 OTP 也有一些缺点。它们依赖于服务器和用户之间的共享密钥,不能为最终用户提供最佳可用性,同时仍然容易受到网络钓鱼或诈骗等常见攻击。正如我们稍后将看到的,Keycloak 通过使用安全设备作为使用 WebAuthn 的第二个因素来帮助您克服这些限制。Keycloak 使使用 OTP 配置和验证用户变得容易,其中领域自动配置为支持使用 OTP 的 2FA。用户还可以通过注册他们的设备来生成 OTP 代码,轻松地为他们的帐户设置 2FA。

在接下来的几节中,我们将了解如何使用 OTP 配置和验证用户。

更改 OTP 策略

Keycloak 允许您为 OTP 定义不同的策略。可以通过单击左侧菜单上的 Authentication 链接,然后单击 OTP Policy 选项卡来更改这些策略:
在这里插入图片描述

图 11.13:OTP 策略选项卡

OTP 是基于密钥的代码(使用特定算法进行哈希处理)和移动因子,可以是当前时间或计数器,其中此代码只能使用一次来验证用户。Keycloak 可以使用两种主要算法进行身份验证并允许用户生成代码:

  • 基于时间的一次性密码 (TOTP)

  • 基于 HMAC 的一次性密码 (HOTP)

默认情况下,在 Keycloak 中创建的领域配置为使用 TOTP。它们还配置了仅 6 位数字,有效期窗口为 30 秒。您可以根据需要随时更改这些设置。

当您更改此选项卡中的详细信息(主要是 OTP 类型和哈希算法)时,请确保您的用户用于生成代码的应用程序支持该配置。

这两种算法之间的区别在于用于生成代码的移动因子以及它们的验证方式。顾名思义,TOTP 是基于时间的,因此代码仅在一定时间内有效 —— 通常为 30 秒。另一方面,HOTP 基于计数器。代码的有效性是无限的,直到代码得到验证并增加计数器。

使用哪种算法的决定取决于具体用例。但是,TOTP 提供比 HOTP 更好的安全性,因为如果代码丢失或泄露,其有效性窗口会缩短,从而减少使用 OTP 时的攻击面。

由于 TOTP 是基于时间的,您应该知道部署 Keycloak 的主机的时钟应该与用户用来生成代码的设备同步。如果 clock 不同步,则用户可能无法使用 TOTP 进行身份验证。您应该能够定义 clock skew compensation 以减少 clocks 之间的差异。为此,请将 Look ahead Window 设置为补偿时间差的秒数。

从用户的角度来看,Keycloak 允许他们使用 Android 和 iOS 应用商店提供的两个主要移动应用程序从自己的个人设备(例如智能手机或平板电脑)获取 OTP 代码:

  • 免费 OTP

  • 谷歌身份验证器

正如您将在接下来的几节中学到的那样,通过使用这些应用程序中的任何一个,您的用户可以轻松地为其帐户启用 2FA,并使用 OTP 在领域中进行身份验证。

在本节中,您了解了 OTP 以及如何更改其设置。您还了解到,用户可以使用他们喜欢的设备通过 FreeOTP 和 Google Authenticator 应用程序生成代码。

现在,让我们看看我们可以使用的不同策略来使用 OTP 对用户进行身份验证。

允许用户选择是否要使用 OTP

一旦您的用户使用他们的密码成功进行身份验证,Keycloak 将检查他们是否拥有与其帐户关联的任何 OTP 凭据。如果未设置 OTP 凭据,Keycloak 将对用户进行身份验证并将用户重定向回应用程序。这是到目前为止,当用户对领域进行身份验证时,您看到的行为。

但是,如果用户设置了 OTP 凭证,Keycloak 将在身份验证流程中执行一个额外的步骤,以从用户那里获取 OTP 并对其进行验证,然后再对用户进行身份验证。

让我们通过使用用户 alice 登录到账户控制台来了解其工作原理。为此,请打开浏览器以 http://localhost:8080/realms/myrealm/account 并使用适当的用户凭据登录。请注意,目前 alice 仅使用她的密码进行身份验证。

在账户控制台中,用户可以在 Signing in (登录) 页面上单击 Set up authenticator application (设置身份验证器应用程序) 按钮,使用 OTP 设置 2FA:
在这里插入图片描述
图 11.14:使用 OTP 配置 2FA

选择设置新的身份验证器后,您的用户将看到一个 QR 码,该 QR 码表示将用于生成验证码的共享密钥。

通过使用智能手机,您应该能够使用 FreeOTP 或 Google Authenticator 移动应用程序扫描此二维码:
在这里插入图片描述
在这里插入图片描述

图 11.15:配置新的 OTP

使用这些应用程序中的任何一个扫描 QR 码后,他们将开始生成代码,我们将使用这些代码来完成 OTP 凭据注册过程,并在我们完成此步骤后稍后对用户进行身份验证。请注意,由于我们使用的是 TOTP,因此每 30 秒生成一次代码。

要完成 OTP 凭证注册过程,请使用您正在使用的移动应用程序中的任何代码设置 One-time code 字段,然后单击 Submit 按钮。(可选)用户还可以为 OTP 凭证定义别名,以将其与特定设备或应用程序相关联。

现在,让我们尝试再次以 alice 身份进行身份验证。为此,请单击页面左上角的 Sign Out 链接以从账户控制台注销,然后使用该用户的用户名和密码再次进行身份验证:
在这里插入图片描述
图 11.16: 登录时提示用户提供代码

与以前发生的情况相比,现在,您将看到一个页面,要求您提供代码。使用智能手机获取验证码并填写 One-time code (一次性验证码) 字段。通过单击 “登录” 按钮,如果 Keycloak 能够成功验证您提供的代码,您应该能够访问帐户控制台。

在本节中,您了解了 Keycloak 默认需要 2FA,但前提是用户与 OTP 凭证相关联。您还了解到,通过利用账户控制台,用户可以轻松地为其账户设置 2FA。

在下一节中,您将学习如何对领域中的所有用户强制实施 2FA。

强制用户使用 OTP 进行身份验证

对于某些使用案例,是否使用 OTP 进行身份验证的决定不由用户决定,而是基于为领域定义的安全约束。Keycloak 允许您更改 OTP 身份验证的默认行为,以强制用户在进行身份验证之前设置 OTP 凭据,或使用现有凭据成功对领域进行身份验证。

要启用此行为,请单击左侧菜单上的 Authentication 链接,然后单击列表中的 My Browser 身份验证流程定义。

My Browser 流定义在本章的开头创建,它应该绑定到 Browser 流。

在此页面上,您将更改 My Browser Browser - Conditional OTP 步骤的要求,并将其标记为 Required:
在这里插入图片描述
图 11.17: 对领域实施 2FA

现在,转到 alice 的用户设置并删除与该账户关联的 OTP 凭证。

请注意,与密码类似,管理员可以设置必需的作,以强制用户在登录时配置 OTP。对于 OTP,所需作的名称为 Configure OTP。

现在,让我们使用 alice 登录到账户控制台。为此,打开浏览器访问 http://localhost:8080/realms/myrealm/account,并使用用户的凭据登录。

与以前发生的情况相比,用户现在被迫设置 OTP 凭证。执行此作的步骤与使用 account 控制台时的步骤相同,如您在上一节中了解的那样。这里的主要区别在于,如果用户没有 OTP 凭证,则有义务设置 OTP 凭证。只有在那之后,他们才能在领域中进行身份验证。

在本节中,您学习了如何使用 OTP 对领域启用 2FA。您了解到 2FA 提供的身份验证比仅使用密码对用户进行身份验证更强大。您还了解到,用户可以使用 FreeOTP 或 Google Authenticator 应用程序轻松地为其帐户启用 2FA。

我们将扩展本章中介绍的概念,以使用 WebAuthn 为 2FA 和 MFA 设置更强的身份验证。

使用 Web 身份验证 (WebAuthn)

WebAuthn 协议旨在提高通过 Internet 对用户进行身份验证的安全性和可用性。为此,它为服务器和安全设备提供了额外的功能,以使用浏览器作为中介相互通信,以使用加密协议对用户进行身份验证。

WebAuthn 基于非对称密钥(私有 - 公钥对),用于安全地注册用户的设备并在系统中对其进行身份验证。设备和服务器之间没有共享密钥,只有公钥。通过充当安全设备和服务器之间的中介,WebAuthn 可以使用这些设备通过生物识别技术进行 2FA 或 MFA,或者无需除安全设备之外的任何明确凭证即可无缝验证用户:这一概念也称为无用户名和无密码身份验证。

当用于 2FA 时,WebAuthn 是一种比 OTP 更安全的方法,因为 Keycloak 和用于生成代码的第三方应用程序之间没有共享密钥。相反,用户被授予一个安全设备,该设备依靠强大的加密技术来传达第二个因素,而不会暴露任何敏感数据。

对于用户来说,WebAuthn 完全无需处理密码或 OTP 代码,从而改善了他们向系统进行身份验证时的体验。相反,他们可以使用自己的设备对自己进行无缝身份验证。

安全设备或身份验证器可以是任何东西,只要它符合 FIDO2 的一系列要求即可。它可以是支持指纹的智能手机、通过 USB 连接的安全密钥或近场通信 (NFC) 设备。

WebAuthn 使您可以精细控制用户如何通过这些设备进行注册和身份验证的不同方面。它允许您控制如何验证拥有设备的用户的身份或是否应将凭证存储在设备中的要求,因此无需在服务器上存储凭证。

在 Keycloak 中,您可以使用 WebAuthn 来解决不同的用例:

  • 允许用户在身份验证期间或使用帐户控制台注册设备。

  • 使用 2FA 安全设备作为 OTP 的更安全的替代方案。

  • 使用安全设备进行 MFA,并使用这些设备支持的任何形式的生物识别授权。

  • 使用安全设备进行无用户名或无密码的身份验证。

您还应该能够允许用户在登录页面上时从多种身份验证方法中进行选择。例如,您可以允许用户选择是使用 WebAuthn 的无密码身份验证,还是使用 OTP 作为第二个因素的基于密码的身份验证。

有关如何在 Keycloak 中使用 WebAuthn 的更多详细信息,请查看 https://www.keycloak.org/docs/latest/server_admin/# 上提供的文档。

在本节中,您了解了有关 WebAuthn 的一些关键概念,以及它如何帮助采用强身份验证。您还了解到,当安全设备用作第二个因素或无需键入任何凭证时,WebAuthn 可以改善用户体验。

在下一节中,我们将学习如何定义身份验证流程以使用 WebAuthn 对用户进行身份验证。

为身份验证流启用 WebAuthn

为了允许用户使用他们的设备进行身份验证,我们需要创建一个支持 WebAuthn 的身份验证流定义。

根据您在 了解身份验证流 部分中学到的内容,通过执行以下步骤创建新流:

使用 My Browser 流(您在第一部分中创建了它)作为模板创建新流。将新流命名为 My WebAuthn。

从 My WebAuthn My Browser Browser – Conditional OTP 子流中删除 OTP 表单执行。

通过选择 WebAuthn Authenticator 执行,向 My WebAuthn My Browser Browser – Conditional OTP 子流添加新步骤。

将我的 WebAuthn 我的浏览器浏览器 – 条件 OTP 标记为条件流。此时,您应该有一个如下所示的流程定义:
在这里插入图片描述
图 11.18:创建身份验证流定义以使用符合 WebAuthn 的安全设备进行身份验证

最后,将此身份验证流定义与浏览器流相关联。

您可能已经注意到,我们基本上是用 WebAuthn 替换 OTP 以进行 2FA。除了将 OTP 表单执行替换为 WebAuthn Authenticator 执行之外,您无需执行太多作。

如果您尝试登录,您仍然只能使用密码登录,因为用户尚未配置安全设备。

在下一节中,您将了解用户如何使用账户控制台注册安全设备。

注册安全设备并进行身份验证

现在,领域已配置为支持使用 WebAuthn 将安全设备作为第二个身份验证因素,让我们通过账户控制台注册安全设备。在 http://localhost:8080/realms/myrealm/account 中打开浏览器,然后使用所需的用户凭据登录。在账户控制台中,单击左侧菜单上的 Signing in 链接:
在这里插入图片描述
图 11.19:可用设备列表

在此页面上,查看 Security key 部分,然后单击 Set up Security key 以注册安全设备:
在这里插入图片描述
图 11.20:注册设备

要注册新设备,请单击 Register 按钮。浏览器应要求您使用安全密码器完成注册(例如触摸安全密码器),并询问您要为设备命名什么。您可以使用任何您想要的名称。

成功注册设备后,它应列在 2FA 的可用选项中:
在这里插入图片描述
图 11.21:安全设备已成功注册

现在,让我们尝试再次以 alice 身份进行身份验证。为此,请单击页面左上角的 Sign Out 链接,从帐户控制台注销,然后使用用户的用户名和密码再次进行身份验证:
在这里插入图片描述
图 11.22: 要求用户与安全设备交互以完成身份验证过程

以 alice 身份进行身份验证时,系统应提示您与安全设备交互以完成身份验证。请注意,此行为与使用 OTP 作为第二个因素非常相似,但用户不需要键入任何代码,也不需要通过网络发送任何代码。

在本节中,您学习了如何使用账户控制台注册安全设备。您还了解了使用 WebAuthn 和安全设备进行 2FA 是多么容易。然后,您了解到 Keycloak 允许您依靠安全设备提供的任何生物识别授权将 WebAuthn 用于 MFA。

在下一节中,您将了解有关强身份验证的一些关键概念。

使用强身份验证

强身份验证是当今广泛使用的术语。它的含义取决于使用它的上下文。通常,强身份验证是指使用 2FA 或 MFA 对用户进行身份验证。

正如您在前面部分中学到的那样,Keycloak 提供了为领域启用 2FA 或 MFA 所需的功能。如果您对强身份验证的要求仅包括使用 2FA,那么在使用 WebAuthn 时,最好使用 OTP 或安全设备。

但是,MFA 可能是您可以获得的最强大的身份验证形式,其中生物识别授权是安全识别和验证用户的关键方面。在这种情况下,您应该考虑使用 WebAuthn 并设置安全设备来验证用户的身份(例如,使用指纹扫描),以确保使用该设备的用户确实是尝试进行身份验证的用户。

强身份验证还可能涉及利用 2FA 或 MFA 来启用其他身份验证因素,例如 IP 地址的历史记录和用户用于身份验证的设备。在这种情况下,您可能希望根据风险评分或用户的行为选择最佳因素来验证用户。或者,您可能只希望强制用户在访问敏感数据或在您的系统上执行关键作时重新进行身份验证。

在撰写本书时,Keycloak 并未为一些常见的身份验证范式提供内置支持,例如自适应身份验证或基于风险的身份验证。

但是,可以启用对领域的递升式身份验证,以便请求不同且更强的凭证,直到在用户会话生命周期内达到预定的信任级别。有关如何启用递升式身份验证的更多详细信息,请查看 https://www.keycloak.org/docs/latest/server_admin/#_step-up-flow 中的文档。

正如您在本章中学到的那样,Keycloak 在如何为领域配置和实现新形式的身份验证方面非常灵活。正如您将在第 13 章 扩展 Keycloak 中看到的那样,Keycloak 提供了一组服务提供商接口 (SPI),开发人员可以使用这些接口来扩展其核心功能。

在本节中,您快速概述了强身份验证以及 Keycloak 如何帮助您实现它。现在,让我们看一下本章的摘要。

总结

在本章中,为您提供了有关如何在 Keycloak 中对用户进行身份验证的更多详细信息。首先,向您介绍了身份验证流,以及它们在定义用户和客户端如何对领域进行身份验证方面发挥重要作用。您了解了 Keycloak 支持的主要身份验证方法,以及如何配置它们以立即对用户进行身份验证,以及如何组合它们以支持 2FA 和 MFA。最后,简要介绍了强身份验证以及 Keycloak 如何帮助您为领域使用安全的身份验证方法。

通过利用本章中的信息,您现在应该能够自定义 Keycloak 以根据您的需要对用户进行身份验证,并使用不同的身份验证方法。

在下一章中,您将了解会话管理以及它与身份验证的关系。

问题

  1. 如何更改本章中所示页面的外观和感觉?

  2. 我无法按照 WebAuthn 示例注册安全设备。我错过了什么?

延伸阅读

  • Keycloak 身份验证文档:https://www.keycloak.org/docs/latest/server_admin/#configuring-authentication_server_administration_guide
  • Keycloak 必需操作:https://www.keycloak.org/docs/latest/server_admin/#con-required-actions_server_administration_guide
  • Keycloak 登录页面设置:https://www.keycloak.org/docs/latest/server_admin/#controlling-login-options
  • Keycloak 账户控制台:https://www.keycloak.org/docs/latest/server_admin/#_account-service
  • Keycloak 增强身份验证文档:https://www.keycloak.org/docs/latest/server_admin/#_step-up-flow
  • WebAuthn:https://webauthn.io/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值