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

2024 年 6 月 20 日 作者:Pedro Igor

亲爱的 Keycloak 社区:

感谢社区和 Red Hat IT 的许多朋友的共同努力,我们将在 Keycloak 25 中发布 Keycloak 组织功能。

我们很高兴地宣布,我们开启了一段漫长的旅程,以支持客户身份和访问管理 (CIAM),并在一定程度上支持多租户,即当一个领域需要与客户和业务合作伙伴等第三方集成时。

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

此功能最初作为技术预览功能发布,最终目标是在 Keycloak 26 中使其获得支持。此功能的路线图中还有许多其他功能,我们认为这套初始功能是此功能的核心,它将允许我们在其基础上构建更多功能。因此,您的反馈对于确保我们走上解决 CIAM 相关真实用例的正确道路非常重要。

请考虑检查我们的夜间构建,以便了解最新更新和即将发布的下一个主要版本。

有关此功能的更多详细信息,请参阅官方文档

入门

Keycloak 组织功能对用户向领域进行身份验证的方式进行了更改,以识别用户是在组织范围内还是在领域范围内进行身份验证。

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

启动 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

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

  • 用户名:admin

  • 密码:admin

创建一个领域

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

为此,请通过管理控制台创建一个新的领域,使用orgdemo作为名称。

orgdemo领域中创建用户

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

mjane用户是一个领域用户,他的电子邮件帐户与领域中的任何组织都不匹配。我们将使用此用户来表示orgdemo领域中与任何组织无关的现有领域用户。为此,请创建一个用户,如下所示

确保为该用户设置密码,以便您可以向该领域进行身份验证。

现在,创建一个[email protected]用户。此用户将充当现有领域用户,其电子邮件与组织设置的域之一匹配,但尚未加入该组织。此用户可能是通过自助注册创建的,或者通过与自定义身份存储集成创建的,甚至是从领域中可用的身份提供者联合创建的

确保为该用户设置密码,以便您可以向该领域进行身份验证。

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

创建领域时,身份验证流程会自动更新,以启用特定步骤来验证和引导组织成员。更新的身份验证流程为

  • 浏览器

  • 首次代理登录

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

是否应进行身份优先登录的决定是根据领域中是否存在任何组织来确定的。如果尚未创建任何组织,用户将按照通常的步骤使用用户名和密码进行身份验证,或执行配置为浏览器流程的任何其他步骤。

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

  • 用户名:mjane

  • 密码:<password>

提交登录表单后,您将对该领域进行身份验证,并自动重定向到代表用户操作的客户端应用程序。在本例中,即帐户控制台。

在存在组织的情况下向领域进行身份验证

现在,让我们在orgdemo领域中创建一个组织。为此,我们需要通过导航到领域设置页面并启用组织设置来为该领域启用组织。

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

  • 名称:OrgA Inc

  • 域:orga.com

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

与之前的尝试不同,orgdemo领域有一个组织,身份验证流程已更改为先识别用户,然后提示任何凭据。

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

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

尝试再次登录到http://127.0.0.1:8080/realms/orgdemo/account/并输入[email protected]orgdemo领域中没有与该电子邮件关联的帐户。

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

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

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

如果该组织有一个没有设置域的身份提供者,并且这些身份提供者被标记为公共,他们也可以单击身份优先登录页面上的身份提供者链接,在通过身份提供者进行身份验证后自动创建一个帐户并加入orga组织。

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

查看官方文档以了解详细信息。

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

尝试再次登录到http://127.0.0.1:8080/realms/orgdemo/account/并输入[email protected]

与之前不同,现在用户将看到第二步,以提供凭据。鉴于用户存在于orgdemo领域中,即使用户尚未加入组织,也应该可以进行身份验证。

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

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

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

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

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

  • 客户端类型:OpenID Connect

  • 客户端 ID:orgdemo-broker

  • 客户端身份验证:ON

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

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

确保为该用户设置密码,以便您可以向该领域进行身份验证。

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

  • 别名:orga-broker

  • 显示名称:OrgA Inc.

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

  • 客户端 ID:orgdemo-broker

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

最后,让我们关联刚刚在orgdemo领域中创建的身份提供者,并将其链接到orga组织。为此,请单击菜单中的组织部分,然后选择OrgA Inc组织。导航到身份提供者选项卡,单击链接身份提供者按钮,并提供以下设置

  • 身份提供者:orga-broker

  • 域:orga.com

  • 电子邮件域匹配时重定向:ON

尝试再次登录到http://127.0.0.1:8080/realms/orgdemo/account/并输入[email protected]。用户现在将自动重定向到orga领域以进行身份验证。

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

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

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

如果您以[email protected]用户重新身份验证,情况也是如此。但是,这次用户已与身份提供者关联,并将始终通过身份提供者进行身份验证。

使用组织元数据在承载令牌中,以从领域中的客户端访问受保护资源

到目前为止,我们一直在使用orgdemo领域中的帐户控制台客户端来验证用户。作为 OpenID Connect 客户端,成功身份验证后会颁发访问令牌。

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

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

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

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

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

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