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

时间:2015-06-30 08:06:46

标签: java saml-2.0 spring-saml

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

我们的一位客户正在为其身份提供商提供包含参数的网址。元数据看起来像这样(简称为简洁):

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

可以看出,有一个名为&#34;参数&#34;的参数。值&#34;值&#34;。生成的重定向URL中不存在此参数。我调试了一下,发现SAMLProcessorImpl从绑定中获取MessageEncoder(HTTP重定向为HTTPRedirectDeflateEncoder)并委托编码消息。编码器依次在其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

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

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

2 个答案:

答案 0 :(得分:2)

SAML身份验证请求应仅由受信任的实体发送,并且必须使用无法篡改的参数。除了根据HTTP-Redirect绑定编码的SAMLAuthnRequest之外添加参数将意味着潜在的攻击者可以随意更改值,并且IDP将无法检测到此类更改 - 因为参数不会被数字签名覆盖

除了名为relayState的请求之外,SAML还提供了一种传递安全内容的机制 - 您可以使用Spring SAML的WebSSOProfileOptions来设置它。

以上是清除参数的原因(至少我是这么认为的,这个逻辑来自OpenSAML库,不是我写的),但当然如果你不介意安全隐患,那么这个方法你发现很好。

答案 1 :(得分:0)

目前我通过扩展HTTPRedirectDeflateEncoder,复制buildRedirectURL的代码并删除queryParams.clear()来解决问题。由于URL是通过简单连接创建的,因此我明确删除了所有保留的SAML参数(如SigAlg等),以避免潜在的安全问题。在那之后,它是一个简单的Spring配置更改,将所有内容连接在一起。

但我仍然不知道为什么列表会在第一时间被清除。