查询字符串未在SAML HTTP重定向绑定中保留

mus*_*iKk 6 java saml-2.0 spring-saml

我们使用Spring SAML Security Extension在我们的应用程序中实现SAML.我们现在有以下问题:

我们的一位客户正在为其身份提供商提供包含参数的URL.元数据看起来像这样(为简洁起见,大量缩写):

<EntityDescriptor>
  <IDPSSODescriptor>
    <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
        Location="https://idp.example.com/login?parameter=value"/>
  </IDPSSODescriptor>
</EntityDescriptor>
Run Code Online (Sandbox Code Playgroud)

可以看出,有一个名为"parameter"的参数,其值为"value".生成的重定向URL中不存在此参数.我调试了一下,发现从绑定中SAMLProcessorImpl获取MessageEncoder(HTTPRedirectDeflateEncoder用于HTTP重定向)并委托编码消息.编码器依次在其buildRedirectURL方法中执行以下操作:

// endpointURL is https://idp.example.com/login?parameter=value here
URLBuilder urlBuilder = new URLBuilder(endpointURL);

List<Pair<String, String>> queryParams = urlBuilder.getQueryParams();
queryParams.clear(); // whoops
Run Code Online (Sandbox Code Playgroud)

因此,出于某种原因,有意无条件地剥离参数.

为什么会出现这种情况?如何以最有效的方式解决这个问题?

mus*_*iKk 0

现在我通过扩展HTTPRedirectDeflateEncoder、复制代码buildRedirectURL并删除queryParams.clear(). 由于 URL 是通过简单串联创建的,因此我明确删除了所有保留的 SAML 参数(类似SigAlg等)以​​避免潜在的安全问题。之后,只需更改 Spring 配置即可将所有内容连接在一起。

不过,我仍然不知道为什么该列表首先被清除。