【问题标题】:SAML Signature Tag Name StandardSAML 签名标签名称标准
【发布时间】:2021-05-28 16:59:15
【问题描述】:
SAML 签名不应该总是<ds:Signature ></ds:Signature>...我注意到一些 Idp 使用 <Signature> 和一些使用 <ds:Signature>
在 C# 中,我正在尝试使用 Signature 节点。
XmlNodeList nodeList = samlDoc.GetElementsByTagName("ds:Signature");
当签名标记以<Signature> 开头而没有ds: 前缀时,它会失败。我在这里有什么遗漏吗?
【问题讨论】:
标签:
c#
single-sign-on
saml
saml-2.0
【解决方案1】:
没有。不需要使用 ds 作为前缀。大多数使用 ds 前缀的 Java 实现都遵循某些约定,但 .NET 框架没有。如果有人愿意,他们可以使用 xyz 作为前缀。
重要的是元素名称(签名)和声明它的命名空间(http://www.w3.org/2000/09/xmldsig#)。你不应该对前缀做任何假设。选择基于元素名称和命名空间的节点,完全忽略前缀。
【解决方案2】:
不,如果在元素上方的命名空间中提到它,它不应该存在,如下所示:
<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>
【解决方案3】:
感谢 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);