大家~!最近我建立了一个项目,使用spring security saml扩展作为SP,ADFS作为idp,并且由spring security saml扩展创建的AuthnRequest xml是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="http://127.0.0.1:8080/sp"
ForceAuthn="false" ID="9135430817744047388" IsPassive="false"
IssueInstant="2016-11-17T06:20:05.912Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0">
<samlp:Issuer xmlns:samlp="urn:oasis:names:tc:SAML:2.0:assertion">
test
</samlp:Issuer>
<saml2p:NameIDPolicy
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" AllowCreate="true"/>
</samlp:AuthnRequest>
当我将此 SAMLRequest 发送到 ADFS 服务器时,服务器响应一个类似“urn:oasis:names:tc:SAML:2.0:status:Responder”的错误,并且没有断言内容。为了测试,我使用 OpenSAML 编写了一些 java 代码来创建 AuthnRequest xml,然后更改了属性
ID="9135430817744047388"
到
ID="_9135430817744047388"
然后一切正常。看来ID中的字符_
会影响结果。 所以我的问题是,如何更改 spring security saml 扩展中的 ID 属性以在 ID 前面添加 _
?
请您参考如下方法:
我犯了一个错误,字符_
无关紧要,而是请求的符号类型,由于元数据生成器的属性requestSigned
默认设置为true,spring saml会在http post请求中添加SigAlg
和Signature
参数,然后adfs服务器将检查SP在IDP中注册的证书,而我不提供客户端向 IDP 颁发证书。 解决方案:将属性 requestSigned
设置为 false,这样 spring saml 就不会发送 SAMLRequest 的签名,一切正常。