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);
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);