Docker + Keycloak + IIS 反向代理:对外部 Idp“/authorize”端点的调用被代理域名替换

问题描述 投票:0回答:1

我有一个 dockerized keycloak 容器,在带有 IIS 反向代理的 VPN 内运行,当尝试使用代理域名时,该容器似乎会使用代理域名覆盖 login.microsoftonline.com/[tenantId]/.../authorize 端点 url通过 Keycloak OIDC 身份提供商登录 Microsoft。

我的设置如下: 运行 docker+Keycloak:22.01 (Quarkus) 的 Ubuntu Linux 作为生产环境运行 运行具有有效 SSL 证书的 IIS 反向代理的 Windows Server 2019 全部在同一个VPN下

反向代理:www.example_kcproxy.com指向example_private_ip:port 根据 Keycloak 文档的建议,我将反向代理设置为 Forwarded-For、Forwarded-Port、Forwarded-Host、Forwarded-Proto 标头到相应的值(web.config):

<serverVariables>
 <set name="HTTP_X_Forwarded_Proto" value="https" />
 <set name="HTTP_X_Forwarded_For" value="{HTTP_X_Forwarded_For},{REMOTE_ADDR}"/>
 <set name="HTTP_X_Forwarded_Host" value="{HTTP_HOST}" />
</serverVariables>

我的 docker-compose 配置(Keycloak 环境部分):

KEYCLOAK_PROXY_ADDRESS_FORWARDING: 1
KEYCLOAK_FRONTEND_URL: https://www.example_kcproxy.com/
KC_HOSTNAME_ADMIN_URL: https://www.example_kcproxy.com/
KC_HOSTNAME_STRICT: 1
KC_PROXY: edge
KC_HOSTNAME: www.example_kcproxy.com
KC_HOSTNAME_STRICT_HTTPS: 1

我尝试了不同的设置和设置组合。这只是我的最终配置,它是稳定的并且可以用于生产。

所以通过反向代理一切都工作得很好。我可以通过 Keycloak 前端进行管理,配置身份提供者、客户端、领域等

我已成功设置用于代理 Microsoft Azure AD 登录的 OIDC 身份提供商。 我已经在 VPN 上直接在没有反向代理的情况下测试了此设置,并且我可以从 Keycloak 管理员通过 Microsoft 成功登录。

太好了,一切都好!但是,当我引入反向代理时,所有与 keycloak 管理相关的内容都可以完美运行,除非我尝试通过 Microsoft IdP 登录。 Microsoft 授权 URL,例如Keycloak 需要使用 login.microsoftonline.com/[tenantId]/.../authorize 将我重定向到 Microsoft 登录同意屏幕,并将其基本 URL 替换为 www.example_kc_proxy.com。然后我得到 www.example_kcproxy.com/[tenantId]/.../authorize。这是不正确的......这是我的问题。

我几乎可以肯定 Keycloak 正在使用反向代理标头来构造这个有趣的 url,因为在为 Keycloak 领域设置身份提供程序时,我将正确的 url 指定为授权 Url。当我删除 X-Forwarded* 标头时,Keycloak 仍然会替换 Microsoft 登录域 url,但这次替换为 example_private_ip:port,这本质上是同一个问题,只是实际的 keycloak 服务器 IP。

我可能缺少一些配置设置,以确保 Keycloak 不会覆盖 microsoft 上授权端点的 login.microsoftonline.com url。

所以不知道,我被困在这里哈哈。任何帮助将不胜感激,谢谢!

docker iis keycloak reverse-proxy idp
1个回答
0
投票

好的,

看起来特定于 IIS 反向代理的问题是 IIS 服务器本身的应用程序请求路由 (ARR) 配置设置。需要取消选中“ReverseRewriteHostInResponseHeaders”复选框。现在,原来的 login.microsoftonline.com 不会被代理站点地址覆盖。

参考:避免在 IIS 上使用反向代理重写外部应用程序的 URL?

© www.soinside.com 2019 - 2024. All rights reserved.