SAML 签名标签名称标准

SAML Signature Tag Name Standard

SAML 签名不应该总是 <ds:Signature ></ds:Signature>...我注意到有些 Idp 使用 <Signature> 而有些使用 <ds:Signature>

在 C# 中,我正在尝试使用 Signature 节点。

XmlNodeList nodeList = samlDoc.GetElementsByTagName("ds:Signature");

当签名标签以 <Signature> 开头且没有 ds: 前缀时失败。我在这里遗漏了什么吗?

没有。不需要使用 ds 作为前缀。大多数使用 ds 前缀的 Java 实现都遵循某些约定,但 .NET 框架没有。如果有人愿意,他们可以使用 xyz 作为前缀。

重要的是元素名称(签名)和声明它的名称空间 (http://www.w3.org/2000/09/xmldsig#)。您不应该对前缀做任何假设。 Select 节点基于元素名称和命名空间并完全忽略前缀。

不,它不应该出现在元素上方的命名空间中,例如:

<samlp:Response xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
    ...>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        ...
    </Signature>
</samlp:Response>

感谢 Andrew、ComponentSpace 和 Yarkov 强调命名空间重要性的回答。我使用 System.XML 程序集中的 XmlNamespaceManager 来获取签名值。

XmlNamespaceManager manager = new XmlNamespaceManager(samlDoc.NameTable);
manager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
manager.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion");
manager.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
XmlNodeList nodeList = samlDoc.SelectNodes("//ds:Signature", manager);