我正在与IDP接口并创建一个基本的AuthNRequest,如下所示:
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="IDTest1"
Version="2.0"
IssueInstant="2013-03-04T09:21:59"
AssertionConsumerServiceIndex="0"
AttributeConsumingServiceIndex="0">
<saml:Issuer>https://myapp.com/saml2/sp</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
IDP希望我按签名发送请求。我的问题是:
答案 0 :(得分:5)
如果您构建自己的请求而没有任何更大的框架,我可以推荐OpenSAML。它是一个帮助构建SAML消息的库。
在我的书A Guide to OpenSAML中,详细解释了这一点和更多内容。
编辑我发布了new edition of the book,涵盖了OpenSAML V3
Here是我在签署SAML邮件时写的一个例子
And one关于如何分派AuthnRequests。
答案 1 :(得分:5)
请注意,文档中包含了很多内容:
要签署请求,您需要添加类似的内容(通常在sp.xml中找到):
<SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
签名密钥类似于:
<KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate> MIIDWTC...CAkGgAwIBAgIEe+a+/uaSZCp5g2z+hRWRV+DyfQc9nO
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</KeyDescriptor>
其中MII ...是公钥。
根据@Stefan,使用图书馆要容易得多。
答案 2 :(得分:5)
SAML身份验证请求是一个XML文档。您可以像签署任何其他XML文档一样签署SAML身份验证请求。但是,有一些限制:
您可以在第5节中详细了解SAML断言和协议规范(http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)。
答案 3 :(得分:2)
关于安全的事情从来都不容易...... 你sholud defolly检查由@nzpcmad链接的文档,以及 SAML2 profiles(查找WB SSO - Web浏览器单点登录)。
对于Java,OpenSaml确实是最简单的解决方案之一。
答案 4 :(得分:2)
你的问题不够充分!
您发送的AuthRequest似乎是 REDIRECT 请求,您将看不到摘要,签名和证书,因为所有这些详细信息都将以URL作为参数。
尝试使用 POST SSO 请求,您将在SAML请求中看到摘要,签名和证书。
Metadata
,其基本配置如id,签名算法,哈希方法,公钥等。答案 5 :(得分:1)
一个陷阱似乎是,通过HTTP-Redirect Binding,签名由附加的URL-Parameters传输,而不是SAMLRequest值的一部分,例如: https://my-idp.com/login?SAMLRequest=nVNN...%3D&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=QZ64...%3D%3D