【问题标题】:Why XPATH with SAML prefix can get SAML2 prefix element?为什么带有 SAML 前缀的 XPATH 可以获得 SAML2 前缀元素?
【发布时间】:2019-09-30 05:24:34
【问题描述】:

我正在使用 .NET 核心实现 saml 应用程序。我有疑问

SelectSingleNode(string xpath, XmlNamespaceManager nsmgr) 

我的 SAMLResponse 有 saml2 和 saml2p 前缀。

例如

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">

<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">

有方法调用

_xmlDoc.SelectSingleNode("/samlp:Response/saml:Assertion", GetNamespaceManager())

其中 _xmlDoc 是具有 saml2 和 saml2p 前缀的 SAMLResponse,而 GetNamespaceManager() 是

private XmlNamespaceManager GetNamespaceManager()
{
    XmlNamespaceManager manager = new XmlNamespaceManager(_xmlDoc.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");

    return manager;
}

为什么即使 XPATH 选择器是 saml/samlp 前缀,该方法调用也可以返回 SAML2 前缀元素?我对此感到非常困惑。

附言我使用来自 https://github.com/jitbit/AspNetSaml 的库来开发我的 saml 应用程序。

[2019 年 9 月 30 日 14:21 更新 GMT+7] 我尝试将 SelectSingleNodeXmlNamespaceManager 中的前缀更改为不是 saml 或 saml2 的前缀。改变的结果是一样的。我认为有一些关于 xml 前缀和命名空间的东西。我需要一些额外的解释。

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。你的问题已经很好了我只是有一些指示:请不要在问题标题中添加标签,除非这些标签在问题中自然出现。另外,请为您的代码围栏提供代码标识符,如下所示:```[code identifier]。开箱即用支持多种语言,例如 c#xmlxaml,不胜枚举

标签: c# xml xpath saml saml-2.0


【解决方案1】:

为什么即使 XPATH 选择器是 saml/samlp 前缀,该方法调用也可以返回 SAML2 前缀元素?

您已将这些命名空间前缀添加到命名空间管理器,使用 XML 本身中用于 saml2psaml2 前缀的相同实际命名空间声明。 IE。您已经告诉命名空间管理器,samlp 前缀应该对应于 XML 命名空间 "urn:oasis:names:tc:SAML:2.0:protocol",这与 saml2p 前缀对应的命名空间相同。

使用您的 samlp 前缀的 XPATH 选择器将匹配 任何 被声明为对应于 "urn:oasis:names:tc:SAML:2.0:protocol" 命名空间的命名空间前缀。由于 saml2p 前缀确实如此,它将匹配具有该前缀的节点。

saml2saml 也是如此。

确保您没有将 XML 命名空间前缀与 XML 命名空间本身混为一谈,这一点非常重要。 XML 中的命名空间是字符串"urn:oasis:names:tc:SAML:2.0:protocol""urn:oasis:names:tc:SAML:2.0:assertion"。前缀是标识符saml2psaml2samlpsaml(以及ds,就此而言)。前缀只是引用实际命名空间的方式。

因此,同样可以将两个不同的变量分配给同一个字符串值,因此这两个不同的变量名称可以在代码中“表示”相同的字符串值,两个 XML 命名空间前缀 @ 也是如此987654338@ 和 samlp 的含义相同,saml2saml 也一样。

因此,为了命名 XML 节点,无论是通过 XPATH 还是 API 中的任何其他搜索机制,重要的是 命名空间 本身,而不是用于指定命名空间的任何前缀。

因此,您的 XPATH 表达式 "/samlp:Response/saml:Assertion" 可以在您的 XML 中找到 Assertion 元素,即使该表达式使用的前缀与 XML 文档本身中使用的前缀不同。 XPATH 中的节点引用仍与 XML 本身中声明的名称空间相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多