Keycloak IdP发起SSO配置遇无效重定向URI错误求助
环境与已配置信息
- Keycloak A(服务提供商/SP):部署于
dev.my-host/auth,使用masterrealm - Keycloak B(身份提供商/IdP):部署于
staging.my-host/auth,使用masterrealm - 目标应用:部署于
dev.my-app - 已完成配置:
- Keycloak A中创建别名
test-saml的SAML v2.0 IdP提供商,导入Keycloak B的SAML描述符 - Keycloak B中创建SAML客户端:
- 客户端ID为Keycloak A中IdP的实体ID
- Master SAML Processing URL设为
https://dev.myhost/auth/realms/master/broker/test-saml/endpoint/clients/sso-staging-client - IDP-Initiated SSO URL名称设为
my-app
- Keycloak A中创建SAML客户端:
- IDP-Initiated SSO URL名称设为
sso-staging-client - Home URL为
dev.my-app/home - Root URL为
dev.my-host/auth - Valid redirect urls设为
*,禁用签名与加密
- IDP-Initiated SSO URL名称设为
- Keycloak A中创建别名
问题现象
访问https://staging.my-host/auth/realms/master/protocol/saml/clients/my-app后,重定向至Keycloak A的broker endpoint,出现Invalid Redirect uri错误,无相关日志,调整Keycloak B客户端的relay state无效。
排查步骤
1. 修正URL拼写一致性
检查所有配置中的域名格式:你环境里Keycloak A部署在dev.my-host/auth,但Keycloak B中配置的Master SAML Processing URL用了dev.myhost(缺少短横线),这种拼写错误会直接导致重定向URI不匹配。确保所有URL的域名、协议(https://)完全一致,包括Keycloak A中SAML客户端的Home URL、Root URL。
2. 确认SP客户端的重定向允许规则
虽然设置了Valid redirect urls为*,但Keycloak处理broker跳转时,仍会验证最终应用URL是否在允许列表内。修改Keycloak A的SAML客户端Valid redirect urls为明确的应用路径:https://dev.my-app/*,避免通配符规则的潜在兼容问题。同时检查该客户端的IDP-Initiated SSO Relay State是否设置为https://dev.my-app/home,确保最终跳转目标正确。
3. 调整Keycloak B的IdP初始化配置
在Keycloak B的SAML客户端配置中:
- 将
IDP-Initiated SSO Relay State设置为Keycloak A中SAML客户端的IDP-Initiated SSO URL名称(sso-staging-client),或直接指定https://dev.my-app/home - 开启
Force POST Binding选项,部分场景下GET请求的重定向URI会被拦截,POST方式更稳定
4. 启用调试日志定位根因
Keycloak默认日志级别较低,需开启SAML相关调试日志:
- 修改Keycloak A的
keycloak.conf(或standalone.xml)添加日志配置:loggers=org.keycloak.broker.saml,org.keycloak.protocol.saml logger.org.keycloak.broker.saml.level=DEBUG logger.org.keycloak.protocol.saml.level=DEBUG - 重启Keycloak A后触发SSO流程,查看
server.log,日志会明确指出哪个重定向URI不被允许,以及具体的验证逻辑失败点。
5. 验证SP与IdP的实体ID匹配
确认Keycloak B中SAML客户端的Client ID完全等于Keycloak A中test-saml IdP提供商的Entity ID,任何字符(包括大小写、路径)的不一致都会导致SAML断言验证失败,进而触发重定向URI错误。
内容的提问来源于stack exchange,提问作者Apostolos

