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