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
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 组织功能是一项技术预览功能,需要在启动(或构建服务器的优化镜像)时启用
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
让我们首先创建一个名为 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,并自动重定向到代表用户操作的客户端应用程序。在本例中,为帐户控制台。
现在,让我们在 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
用户身份重新进行身份验证,情况也是如此。但是,这次用户已与身份提供商链接,并将始终通过身份提供商进行身份验证。
到目前为止,我们一直在使用 orgdemo
realm 中的帐户控制台客户端来验证用户身份。作为 OpenID Connect 客户端,访问令牌是成功身份验证的结果。
在组织上下文中进行身份验证时,访问令牌会自动更新,其中包含有关用户所属组织的特定声明。
要将组织特定的声明映射到令牌中,客户端需要在向服务器发送授权请求时请求 organization
范围。
因此,令牌将包含如下声明
"organization": {
"orga": {}
}
客户端(例如:来自 ID 令牌)和资源服务器(例如:来自访问令牌)可以使用 organization
声明,根据用户所属的组织来授权访问受保护的资源。
organization
范围是 realm 中内置的可选客户端范围。因此,默认情况下,它会添加到 realm 中创建的任何客户端。