Почему XPATH с префиксом SAML может получить элемент префикса SAML2? - PullRequest
0 голосов
/ 30 сентября 2019

Я внедряю приложение saml, используя ядро ​​.NET. У меня вопрос по поводу

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 - это SAMLResponse с префиксом saml2 и saml2p, а 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;
}

Почему этот вызов метода может вернуть элемент префикса SAML2, даже если селектор XPATH является префиксом saml / samlp ?? Я очень озадачен этим.

ps Я использую библиотеку https://github.com/jitbit/AspNetSaml для разработки своего приложения saml.

[Обновление 14:21 30 сен 2019 по Гринвичу + 7] Я пытаюсьне изменять префикс в SelectSingleNode и XmlNamespaceManager на какой-либо префикс, отличный от saml или saml2Результат от изменения такой же. Я думаю, что-то есть в префиксе xml и пространстве имен. Мне нужно дополнительное объяснение.

1 Ответ

0 голосов
/ 01 октября 2019

Почему этот вызов метода может возвращать префиксный элемент SAML2, даже если селектор XPATH является префиксом saml / samlp?

Вы добавили эти префиксы пространства имен в диспетчер пространства имен, используя то же самое фактическое пространство именобъявление, используемое в самом XML для префиксов saml2p и saml2. Т.е. вы сказали менеджеру пространства имен, что префикс samlp должен соответствовать пространству имен XML "urn:oasis:names:tc:SAML:2.0:protocol", которое является тем же пространством имен, которому соответствует префикс saml2p.

Селектор XPATH, использующий ваш samlp префикс будет совпадать с любым префиксом пространства имен, который объявлен соответствующим, идет в пространство имен "urn:oasis:names:tc:SAML:2.0:protocol". Поскольку префикс saml2p делает, он будет сопоставлять узел с этим префиксом.

Аналогично для saml2 и saml.

Очень важно убедиться, что вы не путаетепрефикс пространства имен XML с самим пространством имен XML. Пространства имен в вашем XML - это строки "urn:oasis:names:tc:SAML:2.0:protocol" и "urn:oasis:names:tc:SAML:2.0:assertion". Префиксами являются идентификаторы saml2p, saml2, samlp и samlds, в этом отношении). Префиксы - это просто способы обращения к фактическим пространствам имен.

Таким образом, одинаковым образом две разные переменные могут быть назначены одному и тому же строковому значению, и, таким образом, эти два разных имени переменной могут «означать» одно и то жестроковое значение в коде, поэтому два префикса пространства имен XML saml2p и samlp означают одно и то же, как и saml2 и saml.

Таким образом, для именования узлов XMLбудь то через XPATH или любой другой механизм поиска в API, важно только само пространство имен 1039 *, а не префикс, который использовался для указания пространства имен.

Таким образом, ваше выражение XPATH "/samlp:Response/saml:Assertion" может найти элемент Assertion в вашем XML, даже если это выражение использует префиксы, отличные от тех, которые используются в самом документе XML. Ссылки на узлы в XPATH по-прежнему находятся в том же пространстве имен, что и в самом XML.

...