我目前正在为客户开发 SSO 功能。
如果需要,我们的应用程序将在启动时使用 SSO 功能进行身份验证,如果失败则中止。
我已经阅读了很多解释,并在网上看到了很多例子。
我完全不明白的是证书。具体来说,操作中似乎使用了两个(不同的?)证书。其中一个作为常量存储在我这边,另一个在签名元素的 SAML 响应中发送,如下所示:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#id-2710abae3b0457ad0c241eac043769ae78c83189">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>???</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#id-266b413f5282d3da62de3963e5e25cb0782e1a05">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>???</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>???</ds:SignatureValue>
<ds:KeyInfo Id="id-266b413f5282d3da62de3963e5e25cb0782e1a05">
<ds:X509Data>
<ds:X509Certificate>???</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
标记为“???”的字段 客户在示例响应中没有给我。
至于其他证书,一个很好的例子在这里: “App_Code/AccountSettings.cs”中的https://github.com/onelogin/dotnet-saml。
此外,XML 中还有一个签名,以及其他在线示例中似乎也包含 Base64 数据的两个“DigestValue”字段。
所以我的问题是:本地证书是否与 xml 证书相同,如果不是,它们究竟是如何相关的,签名和 DigestValues 在这种关系中是否相关?
至于上下文,我正在尝试测试我的 SSO 功能,除了证书,我无法弄清楚如何在没有实际值的情况下进行测试。这可以伪造吗?SignedXml.CheckSignature 似乎总是返回 false 无论我在 XML 中放什么,甚至是“真实”示例(在线找到)。