【问题标题】: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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 2020-05-05
        • 1970-01-01
        • 2012-03-11
        • 2019-10-27
        • 2013-06-05
        相关资源
        最近更新 更多