基于Keycloak身份代理、Spring Boot为IDP的SAML SSO配置问题咨询
场景与已完成配置
我正尝试通过SAML SSO登录第三方应用Sentry,架构为:Keycloak作为身份代理(Identity Broker),自研的React前端+Spring Boot后端应用作为身份提供商(IDP),该应用存储用户数据并作为可信数据源。
已完成的配置:
- 在Keycloak中创建身份提供商(XYZ),填入自研应用登录页面的SSO URL;
- 在Keycloak中为Sentry创建客户端并配置相关信息;
- 在Sentry中完成配置,导入Keycloak领域IDP元数据中的SAML 2.0数据;
- 将XYZ身份提供商设置为Keycloak的默认选项。
当前SP发起的登录流程与异常
采用SP-Initiated Flow,流程如下:
- 进入Sentry页面,选择“SAML登录”;
- Sentry向Keycloak发送SAML认证请求,Keycloak将请求重定向至自研应用(XYZ)的登录页面;
- 输入用户凭据完成认证后,自研应用XYZ生成SAML Response;
- 浏览器从XYZ应用重定向至Keycloak配置的重定向URI时,出现
"Invalid saml response"异常。
技术疑问解答
1. Sentry生成SAML认证请求后,Keycloak直接将该请求原样重定向至我的XYZ应用,这是否为正确行为?
不是正确行为。Keycloak作为身份代理,应先处理Sentry发来的SAML请求,生成自己的SAML认证请求转发给自研IDP(XYZ),而非原样转发。Sentry的请求受众是Keycloak,自研IDP无法识别该第三方请求,这也是后续响应无效的核心原因之一。
2. SAML响应的目标应为Keycloak还是Sentry?我的理解(Keycloak解析我的响应并为Sentry生成新响应)是否正确?
你的理解完全正确。自研IDP(XYZ)生成的SAML响应目标必须是Keycloak,因为Keycloak是向XYZ发起认证请求的实体。Keycloak验证通过你的响应后,会基于自身与Sentry的SAML配置,生成针对Sentry的新SAML响应,再转发给Sentry完成登录流程。
3. 若Keycloak需要解析并验证我的SAML响应,该响应需符合何种标准结构才能被Keycloak验证?
必须严格符合SAML 2.0标准,同时满足Keycloak对身份提供商的配置要求:
- 响应必须包含有效的签名(使用Keycloak信任的证书);
- 断言(Assertion)中的
AudienceRestriction必须指向Keycloak的身份提供商回调URL(即你在Keycloak中配置的XYZ IDP的重定向URI); - 断言需包含必要的用户属性(如用户名、邮箱),且属性要与Keycloak中配置的属性映射规则匹配;
- 响应中的
InResponseTo字段必须匹配Keycloak发给自研IDP的认证请求ID; - 响应的有效期(
NotBefore和NotOnOrAfter)必须处于当前时间范围内。
4. SAML响应是否必须对应Sentry发起的初始SAML认证请求?
不需要。自研IDP的响应只需要对应Keycloak发给它的认证请求即可。Sentry的初始请求由Keycloak负责跟踪和关联,自研IDP无需感知Sentry的存在。
5. RelayState参数应设置为何种值?
自研IDP在生成重定向到Keycloak的响应时,需将Keycloak转发过来的原始RelayState参数原样返回。该参数由Keycloak生成,用于关联整个登录流程的上下文(比如记录Sentry的初始请求信息),自研IDP不需要修改,直接传递即可。
6. 自研IDP的配置是否需要包含与Sentry相关的数据?
不需要。自研IDP只需要与Keycloak进行SAML交互,所有与Sentry相关的配置都应在Keycloak和Sentry之间完成。自研IDP仅需知晓Keycloak作为其服务提供商(SP)的元数据信息(如回调URL、证书等)即可。
内容的提问来源于stack exchange,提问作者Rohit Khurana

