SAML签名标签名称标准



SAML签名不应该总是<ds:Signature ></ds:Signature>…我注意到一些Idp使用<Signature>和一些使用<ds:Signature>

在c#中,我试图使用。

获得签名节点
XmlNodeList nodeList = samlDoc.GetElementsByTagName("ds:Signature");

如果Signature标签以<Signature>开头,没有ds:前缀,则失败。我还遗漏了什么吗?

No。不需要使用ds作为前缀。使用ds前缀的大多数Java实现都遵循某些约定,但. net框架没有。如果有人选择这样做,可以使用xyz作为前缀。

重要的是元素名称(Signature)和声明它的名称空间(http://www.w3.org/2000/09/xmldsig#)。你不应该对前缀做任何假设。根据元素名称和名称空间选择节点,并完全忽略前缀。

不,它不应该在那里,以防它在元素上方的命名空间中被提及,像这样:

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

相关内容

  • 没有找到相关文章

最新更新