我们使用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
因此,出于某种原因,有意无条件地剥离参数。
为什么会出现这种情况?如何以最有效的方式解决这个问题?
答案 0 :(得分:2)
SAML身份验证请求应仅由受信任的实体发送,并且必须使用无法篡改的参数。除了根据HTTP-Redirect绑定编码的SAMLAuthnRequest之外添加参数将意味着潜在的攻击者可以随意更改值,并且IDP将无法检测到此类更改 - 因为参数不会被数字签名覆盖
除了名为relayState的请求之外,SAML还提供了一种传递安全内容的机制 - 您可以使用Spring SAML的WebSSOProfileOptions来设置它。
以上是清除参数的原因(至少我是这么认为的,这个逻辑来自OpenSAML库,不是我写的),但当然如果你不介意安全隐患,那么这个方法你发现很好。
答案 1 :(得分:0)
目前我通过扩展HTTPRedirectDeflateEncoder
,复制buildRedirectURL
的代码并删除queryParams.clear()
来解决问题。由于URL是通过简单连接创建的,因此我明确删除了所有保留的SAML参数(如SigAlg
等),以避免潜在的安全问题。在那之后,它是一个简单的Spring配置更改,将所有内容连接在一起。
但我仍然不知道为什么列表会在第一时间被清除。