PingFederate IdP startSSO.ping:如何传数据至SAML属性并精简RelayState
实现PingFederate SSO中参数拆分到SAML属性与精简RelayState的方案
完全可以实现你的需求!PingFederate提供了灵活的扩展机制来处理这类自定义场景,下面分两种常见方案来详细说明:
方案一:绕过TargetResource,直接传递参数(推荐)
没必要把所有参数都嵌套到TargetResource里,PingFederate允许直接在startSSO.ping请求中附加自定义参数,然后提取这些参数到SAML属性中:
步骤1:修改初始请求URL
把参数从TargetResource里剥离出来,直接作为startSSO.ping的请求参数:https://pingfederate.myexample.org/startSSO.ping?TargetResource=https%3A%2F%2Fwebapp.othercompany.org%3FkeepParam%3DkeepThisOnURL¶mOne=valueOne¶mTwo=valueTwo步骤2:配置参数接收与属性映射
- 登录PingFederate控制台,进入你的IdP Connection(或对应的Adapter配置)
- 在Request Processing或Attribute Sources部分,开启允许接收自定义请求参数
- 进入Attribute Mapping页面,添加映射规则:
- 把
${request.param.paramOne}映射到SAML属性(比如命名为paramOne) - 把
${request.param.paramTwo}映射到对应的SAML属性
- 把
- 保存配置后,PingFederate会自动把这些参数值注入到SAMLResponse中,而
RelayState会自动保留原始的TargetResource(仅含keepParam)
方案二:通过脚本修改RelayState并提取TargetResource中的参数
如果必须保留参数在TargetResource里,你可以用PingFederate的脚本扩展能力,在SSO流程中解析URL、剥离多余参数并提取属性值:
实现步骤:
创建Post-Authentication脚本
在PingFederate控制台中,进入IdP > Post-Authentication Processing,添加一个Scripted Policy,选择Groovy脚本(或JavaScript),粘贴以下示例代码:import java.net.URL import java.net.URLDecoder import java.net.URLEncoder // 获取原始的TargetResource参数 def rawTarget = context.getRequestParameter("TargetResource") if (rawTarget) { // 解码URL def decodedTarget = URLDecoder.decode(rawTarget, "UTF-8") URL url = new URL(decodedTarget) def queryParams = url.query?.split("&")?.collectEntries { def parts = it.split("=") [parts[0], parts[1]] } ?: [:] // 提取paramOne和paramTwo到属性上下文 if (queryParams.paramOne) { context.setAttribute("extractedParamOne", queryParams.paramOne) } if (queryParams.paramTwo) { context.setAttribute("extractedParamTwo", queryParams.paramTwo) } // 构建仅含keepParam的新TargetResource def filteredQuery = queryParams.findAll { it.key == "keepParam" } .collect { "${it.key}=${it.value}" } .join("&") def newTarget = "${url.protocol}://${url.host}${url.path}${filteredQuery ? "?$filteredQuery" : ""}" // 更新RelayState为精简后的URL context.setRelayState(URLEncoder.encode(newTarget, "UTF-8")) }配置属性映射
回到你的IdP Connection的Attribute Mapping页面,添加映射规则:- 把
${attr.extractedParamOne}映射到目标SAML属性 - 把
${attr.extractedParamTwo}映射到目标SAML属性
- 把
验证流程
触发SSO请求后,PingFederate会执行脚本:- 从
TargetResource中提取paramOne和paramTwo,存入属性上下文 - 生成仅含
keepParam的新URL作为RelayState - 最终SAMLResponse会包含这两个参数的属性值,同时RelayState符合你的要求
- 从
注意事项
- 确保PingFederate版本支持脚本扩展(PingFederate 8.0及以上版本均支持)
- 脚本中添加适当的异常处理(比如URL解析失败的情况),避免流程中断
- 测试时可以开启PingFederate的调试日志,跟踪参数提取和RelayState修改的过程
内容的提问来源于stack exchange,提问作者James Daily
相关产品推荐
相关产品推荐

