You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&paramOne=valueOne&paramTwo=valueTwo
    
  • 步骤2:配置参数接收与属性映射

    1. 登录PingFederate控制台,进入你的IdP Connection(或对应的Adapter配置)
    2. 在Request Processing或Attribute Sources部分,开启允许接收自定义请求参数
    3. 进入Attribute Mapping页面,添加映射规则:
      • 把${request.param.paramOne}映射到SAML属性(比如命名为paramOne)
      • 把${request.param.paramTwo}映射到对应的SAML属性
    4. 保存配置后,PingFederate会自动把这些参数值注入到SAMLResponse中,而RelayState会自动保留原始的TargetResource(仅含keepParam)

方案二:通过脚本修改RelayState并提取TargetResource中的参数

如果必须保留参数在TargetResource里,你可以用PingFederate的脚本扩展能力,在SSO流程中解析URL、剥离多余参数并提取属性值:

实现步骤:

  1. 创建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"))
    }
    
  2. 配置属性映射
    回到你的IdP Connection的Attribute Mapping页面,添加映射规则:

    • 把${attr.extractedParamOne}映射到目标SAML属性
    • 把${attr.extractedParamTwo}映射到目标SAML属性
  3. 验证流程
    触发SSO请求后,PingFederate会执行脚本:

    • 从TargetResource中提取paramOne和paramTwo,存入属性上下文
    • 生成仅含keepParam的新URL作为RelayState
    • 最终SAMLResponse会包含这两个参数的属性值,同时RelayState符合你的要求

注意事项

  • 确保PingFederate版本支持脚本扩展(PingFederate 8.0及以上版本均支持)
  • 脚本中添加适当的异常处理(比如URL解析失败的情况),避免流程中断
  • 测试时可以开启PingFederate的调试日志,跟踪参数提取和RelayState修改的过程

内容的提问来源于stack exchange,提问作者James Daily

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:32:26