如何在SP发起的SSO中实现PingFederate与OpenAM间RelayState传递?
解决OpenAM(SP)与PingFederate(IDP)间RelayState参数传递问题
我之前也碰到过类似的RelayState传递问题,结合你已经做的尝试,给你几个针对性的解决方案,应该能解决你的问题:
1. 修正PingFederate的RelayState捕获配置
你之前创建的属性映射是把RelayState放到了SAML断言里,但我们需要的是让它成为POST表单的参数。首先要让PingFederate从SP的请求中捕获RelayState:
- 登录PingFederate管理控制台,找到对应的SP连接
- 进入
Request Processing->Request Attributes,添加一个新的请求属性:- 名称:
RelayState - 来源:选择
HTTP Request Parameter - 参数名:填
RelayState
这样PingFederate就能从OpenAM发起的SAML请求中捕获到这个参数了。
- 名称:
2. 修改自动提交模板,动态注入RelayState
你之前手动硬编码RelayState生效了,现在改成动态获取即可。修改你的form.autopost.template.html模板,把硬编码的RelayState行替换成:
<input type="hidden" name="RelayState" value="$escape.escape($requestParameters.get('RelayState'))"/>
如果是通过属性映射存储的RelayState,也可以用$attributeMap.get('RelayState'),具体取决于你在PingFederate中存储参数的方式。
3. 确认PingFederate的SP连接协议配置
检查SP连接的Protocol Settings -> Assertion Consumer Service部分,确保允许传递RelayState参数的选项是开启的(有些默认配置会忽略这个参数)。
4. 验证OpenAM端的RelayState发送配置
确保OpenAM在发起SAML请求时正确传递RelayState:
- 登录OpenAM控制台,进入对应的SAML2 Service Provider配置
- 检查
Advanced->RelayState相关设置,确认启用了RelayState传递,并且参数是URL编码后的合法字符串 - 另外,在
Assertion Consumer Service配置中,确保OpenAM收到RelayState后会执行重定向逻辑,而不是停留在默认的断言处理端点。
5. 调试日志排查
如果还是有问题,开启日志排查:
- PingFederate端:把日志级别设为DEBUG,查看
pingfederate.log,确认RelayState是否被正确捕获,以及在表单生成时是否被注入 - OpenAM端:查看
openam/var/log/debug.log,确认发起请求时是否包含RelayState,以及接收响应时是否获取到该参数
内容的提问来源于stack exchange,提问作者Aniket Dandawate
相关产品推荐
相关产品推荐

