客户身份和访问管理 (CIAM) 及多租户支持

2024 年 6 月 20 日,作者:Pedro Igor

尊敬的 Keycloak 社区:

感谢社区和红帽 IT 众多人士的协作,我们在 Keycloak 25 中推出了 Keycloak 组织功能。

我们很高兴地宣布,我们已开始支持客户身份和访问管理 (CIAM) 的漫长征程,并在一定程度上支持多租户,以便 realm 需要与客户和业务合作伙伴等第三方集成。

Keycloak 组织是一项功能,它利用 Keycloak 现有的身份和访问管理 (IAM) 功能来解决 CIAM 用例,例如企业对企业 (B2B) 和企业对企业对客户 (B2B2C) 集成。通过利用 realm 提供的现有功能,此功能的第一个版本提供了允许 realm 与业务合作伙伴和客户集成的核心功能

该功能最初作为技术预览功能交付,最终目标是在 Keycloak 26 中获得支持。此功能的路线图中还有更多功能,我们认为这组初始功能是该功能的核心,它将使我们能够在之上构建更多功能。因此,您的反馈非常重要,以确保我们在解决围绕 CIAM 的实际用例方面走在正确的道路上。

请考虑查看我们的每晚构建版本,以了解最新的更新以及下一个主要版本中的内容。

有关该功能的更多详细信息,请考虑阅读官方文档中提供的文档。

入门指南

Keycloak 组织功能引入了用户如何向 realm 验证身份的更改,以识别用户是在组织还是 realm 的范围内进行身份验证。

该功能在身份验证方面引入的关键更改之一是,每当您向启用了组织设置的 realm 进行身份验证时,都会引入身份优先登录流程。

启动 Keycloak

Keycloak 组织功能是一项技术预览功能,需要在启动(或构建服务器的优化镜像)时启用

docker run --name kc-orgs -d -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8080:8080 quay.io/keycloak/keycloak start-dev --features organization

运行上述命令后,请确保您可以访问 https://127.0.0.1:8080/ 上的服务器,并使用以下凭据登录到管理控制台

  • 用户名:admin

  • 密码:admin

创建 realm

让我们首先创建一个名为 orgdemo 的新 realm。orgdemo realm 是一家希望与第三方(即组织)集成的第一方公司,以便其用户可以访问 orgdemo realm 中可用的客户端应用程序提供的受保护资源。

为此,请通过管理控制台创建一个新的 realm,并将名称设置为 orgdemo

orgdemo realm 中创建用户

您还需要在 orgdemo realm 中创建一些用户来进行身份验证并执行后续步骤。

mjane 用户是一个 realm 用户,其电子邮件帐户与 realm 中的任何组织都不匹配。我们将使用此用户来表示 orgdemo realm 中不与任何组织关联的现有realm 用户。为此,请按如下方式创建一个用户

  • 用户名:mjane

  • 电子邮件:mjane@orgdemo.com

  • 名字:Mary

  • 姓氏:Jane

请务必为此用户设置密码,以便您可以向 realm 验证身份。

现在,创建 alice@orga.com 用户。此用户将充当一个现有的 realm 用户,其电子邮件与设置为组织的域之一匹配,但尚未成为该组织的成员。此用户可以通过自助注册创建,也可以通过与自定义身份存储集成创建,甚至可以从 realm 中可用的身份提供商进行联合

  • 用户名:alice

  • 电子邮件:alice@orga.com

  • 名字:Alice

  • 姓氏:Chains

请务必为此用户设置密码,以便您可以向 realm 验证身份。

了解启用该功能后身份验证流程的更改

创建 realm 时,身份验证流程会自动更新,以启用用于验证身份和引导组织成员加入的特定步骤。更新的身份验证流程包括

  • 浏览器

  • 首次代理登录

browser 流程的主要更改是,它默认为身份优先登录,以便在提示用户输入凭据之前识别用户。关于 first broker login 流程,主要更改是在用户通过与组织关联的身份提供商进行身份验证并成功完成流程后,自动将用户添加为组织成员。

是否应进行身份优先登录的决定取决于 realm 中是否有任何组织可用。如果尚不存在组织,则用户将按照常用步骤,使用用户名和密码或配置到 browser 流程的任何其他步骤进行身份验证。

尝试访问 https://127.0.0.1:8080/realms/orgdemo/account,您将看到通常的登录页面。在此页面上,您可以像往常一样使用以下凭据向 realm 验证身份

  • 用户名:mjane

  • 密码:<密码>

提交登录表单后,您将通过身份验证进入 realm,并自动重定向到代表用户操作的客户端应用程序。在本例中,为帐户控制台。

当存在组织时,向 realm 验证身份

现在,让我们在 orgademo realm 中创建一个组织。为此,我们需要通过导航到 Realm Settings 页面并启用 Organizations 设置来为 realm 启用组织。

启用组织后,您可以单击菜单中的 Organizations 部分。单击 Create organization 按钮以创建一个新组织,如下所示

  • 名称:OrgA Inc

  • 域名:orga.com

创建 orga 组织后,从客户端应用程序注销并尝试重新登录。此时,您应该看到身份优先登录页面。

与之前的尝试不同,orgdemo realm 现在有一个组织,并且身份验证流程已更改为首先识别用户,然后再提示输入任何凭据。

在身份优先登录页面上,您仍然可以作为 mjane 用户进行身份验证。但是,用户现在将分两步进行身份验证。第一步将仅询问用户名或电子邮件,然后在第二步中提供密码。

尝试使用与组织匹配的电子邮件域作为不存在的用户进行身份验证

尝试再次登录 https://127.0.0.1:8080/realms/orgdemo/account/ 并输入 bob@orga.com。在 orgdemo realm 中,没有与该电子邮件关联的帐户。

如果不存在的用户尝试使用与组织域匹配的电子邮件域进行身份验证,则会再次显示身份优先登录页面,并指示提供的用户名无效。此时,没有理由在第二步中要求用户提供凭据。

有几种方法可以注册用户,以便他可以向 orgdemo realm 验证身份并最终加入 orga 组织。

如果 realm 启用了自助注册设置,则用户可以单击身份优先登录页面上的 Register 链接,并在 orgdemo realm 中创建一个帐户。之后,管理员可以向用户发送邀请链接或手动将其添加为 orga 组织的成员。

如果组织具有未设置域名的身份提供商,并且它们被标记为 public,则他们也可以单击身份优先登录页面上的身份提供商链接,以在通过身份提供商进行身份验证后自动创建帐户并加入 orga 组织。

与上述类似,如果组织具有使用组织域之一设置的身份提供商,则用户将被自动重定向到身份提供商进行身份验证,并在流程完成后自动创建帐户并加入 orga 组织。

有关更多详细信息,请查看官方文档

使用与组织匹配的电子邮件域作为现有用户进行身份验证

尝试再次登录 https://127.0.0.1:8080/realms/orgdemo/account/ 并输入 alice@orga.com

与之前不同,现在向用户显示第二步以提供凭据。鉴于用户存在于 orgdemo realm 中,即使该用户还不是组织的成员,也应该可以进行身份验证。

作为管理员,您可以稍后选择邀请用户加入组织或手动将其添加到组织。

使用与设置为与组织关联的身份提供商的域匹配的电子邮件域作为现有用户进行身份验证

该功能允许您为与组织关联的身份提供商设置域。当您想确保使用特定电子邮件域的用户始终通过身份提供商进行身份验证时,这非常有用。

让我们创建一个 orga realm,以使用 orgdemo realm 中的身份提供商从该 realm 联合用户,其中身份提供商将与 orga 组织关联。

创建 orga realm 后,在此 realm 中创建一个 OpenID Connect 客户端,如下所示

  • 客户端类型:OpenID Connect

  • 客户端 ID:orgdemo-broker

  • 客户端身份验证:开启

  • 有效重定向 URI:*(为了简单起见使用 *,请勿在生产环境中使用)

现在创建一个用户,以便稍后我们可以使用 orgdemo realm 中的身份提供商联合此用户

  • 用户名:jdoe

  • 电子邮件:jdoe@orga.com

  • 名字:John

  • 姓氏:Doe

请务必为此用户设置密码,以便您可以向 realm 验证身份。

现在,让我们在 orgdemo realm 中创建一个 OpenID Connect 身份提供商,如下所示

  • 别名:orga-broker

  • 显示名称:OrgA Inc.

  • 发现端点:https://127.0.0.1:8080/realms/orga/.well-known/openid-configuration

  • 客户端 ID:orgdemo-broker

  • 客户端密钥:<在 orga realm 中创建 orgdemo-broker 客户端时生成的凭据>

最后,让我们关联刚刚在 orgdemo realm 中创建的身份提供商,并将其与 orga 组织链接起来。为此,请单击菜单中的 Organizations 部分,然后选择 OrgA Inc 组织。导航到 Identity Providers 选项卡,然后单击 Link identity provider 按钮并提供以下设置

  • 身份提供商:orga-broker

  • 域名:orga.com

  • 当电子邮件域匹配时重定向:开启

尝试再次登录 https://127.0.0.1:8080/realms/orgdemo/account/ 并输入 jdoe@orga.com。用户现在自动重定向到 orga realm 进行身份验证。

当 realm 中尚不存在的用户尝试使用与组织域匹配的电子邮件域进行身份验证,并且该域也设置为与组织关联的身份提供商时,用户将自动重定向到身份提供商。

通过这样做,您现在可以使用以下凭据在 orga realm 中进行身份验证

  • 用户名:jdoe@orga.com

  • 密码:<密码>

用户完成身份验证后,它将自动重定向回 orgdemo realm 以创建一个帐户并自动加入 orga 组织。

如果您以 jdoe@orga.com 用户身份重新进行身份验证,情况也是如此。但是,这次用户已与身份提供商链接,并将始终通过身份提供商进行身份验证。

在持有者令牌中使用组织元数据以从 realm 中的客户端访问受保护的资源

到目前为止,我们一直在使用 orgdemo realm 中的帐户控制台客户端来验证用户身份。作为 OpenID Connect 客户端,访问令牌是成功身份验证的结果。

在组织上下文中进行身份验证时,访问令牌会自动更新,其中包含有关用户所属组织的特定声明。

要将组织特定的声明映射到令牌中,客户端需要在向服务器发送授权请求时请求 organization 范围。

因此,令牌将包含如下声明

"organization": {
    "orga": {}
}

客户端(例如:来自 ID 令牌)和资源服务器(例如:来自访问令牌)可以使用 organization 声明,根据用户所属的组织来授权访问受保护的资源。

organization 范围是 realm 中内置的可选客户端范围。因此,默认情况下,它会添加到 realm 中创建的任何客户端。