azure - 使用 traefik 授予对特定子域的 Keycloak 角色访问权限

标签 azure keycloak openid-connect traefik

我的目标

总体目标

我想为在同一服务器上托管的 Docker 容器上运行的各种应用程序提供服务,每个应用程序都位于 company.com 的子域上。我希望只有我的组织 (Microsoft AD azure) 中的人员才能访问子域,在某些情况下甚至只有拥有特定 AD 组的人员。

特定于 Keycloak 的目标

我只是想让特定的领域角色能够访问特定的子域,除此之外别无其他。并且仅使用单个领域客户端(请参阅进一步的解释)。

我已经取得的成就

我已经链接了服务器上的多个应用程序,并在特定子域上使用 traefik 为每个应用程序提供服务。例如 app1.company.comapp2.company.com

我还制作了一个中间件,以便所有使用它的路由器都确保用户必须登录。我使用了一个名为 oauththomseddon/traefik-forward-auth 容器。我正在使用 Keycloak,并且已成功链接 Azure Active Directory 作为身份提供商。为此,我启用了一个单租户应用程序并使用其客户端 ID 和 key 。我还成功地将一些 AD 组映射到 Keycloak 角色。

oauth 配置中,我从单个 keycloak 客户端而不是从 azure 应用程序添加了客户端 ID 和 key 。我相信如果我们想使用 traefik 来重定向流量,这是强制性的。

现在,只有我组织内部的人员才能访问每个应用。成功!

我使用的一些文档

Homelab Single Sign-On & TLS

How to Configure Microsoft Azure Active Directory as Keycloak Identity Provider to Enable Single Sign-On

我想做什么

每个应用程序都有自己的子域。但是,我无法弄清楚在哪里进行设置,以便仅当用户具有特定领域角色时才能访问某些子域(由于上述映射器,根据 AD 组自动链接)。

  • 我考虑过在 Keycloak 客户端中添加资源,但我不知道如何使用子域来实现这一点。
  • 另一种选择是为每个子域创建一个客户端,但这意味着我需要为每个子域运行一个 oauth 容器...这似乎有点矫枉过正,而且在不考虑维护的情况下浪费了资源。

最佳答案

我发现的唯一相对简单的解决方案是为我想要的每种权限规则类型(又名 Keycloak 中的角色)创建一个 Keycloak 客户端。

然后,对于每种类型,我必须创建一个 traefik-forward-auth 容器并将其连接到每个 Keycloak 客户端。我仍然使用相同的身份提供程序,因此一旦将其配置为生成角色,您只需告诉哪些角色可以使用哪个客户端。

举个例子,您希望有 3 种类型的权限规则:一种用于管理员,一种用于受信任的用户,一种用于不受信任的用户。它可能看起来像这样:

  • admin.example.com
  • trustedusers.example.com/app1trustedusers.example.com/app2
  • untrustedusers.example.com/app3untrustedusers.example.com/app4

然后,您将在 traefik 中拥有 3 个 forwardAuth 中间件。

这有点麻烦,但您的应用程序仍然使用单个 key 连接到您的 OIDC 提供商,然后您可以使用 keycloak 和这些客户端管理详细信息。

当然,仍然有像最初计划的那样每个应用程序有一个客户端的解决方案。如果您有大量应用程序(每个应用程序一个额外的容器+额外的中间件),这可能是不必要的,而且很麻烦。

关于azure - 使用 traefik 授予对特定子域的 Keycloak 角色访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72953386/

相关文章:

azure - 在 Azure Function App 中配置 Application Insights 的云角色名称

KeyCloak - 入口不允许通过 https 服务连接

c# - Identity Server 4 从 UI 进行身份验证后添加声明

rsa - 验证 JWT.IO 中的签名

php - 无法在 Azure 上加载适用于 PHP 的 Image ImageMagick

azure - 模板部署后输出 Azure SQL 数据库连接字符串

azure - 异常 :"Cannot find the ' Connect-AzureVM' 命令”

java - Keycloak 使用自定义协议(protocol)映射器添加来自数据库/外部源的额外声明

Keycloak:自定义身份提供程序中的 grant_type=password

asp.net-core - 使用 OpenId Connect 进行基于声明的身份验证