Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XPATH SelectSingleNode returns null despite using a XmlNamespaceManager

Tags:

c#

xml

xpath

I'm trying to test an XML document (SAML in this case) that looks like this:

<saml2p:LogoutRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_bbcf6cc5-8832-4567-9a52-7baef04676d7" Version="2.0" IssueInstant="2014-10-21T13:24:54.1397367Z" NotOnOrAfter="2014-10-21T13:34:54.1397367Z">
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <Reference URI="#_bbcf6cc5-8832-4567-9a52-7baef04676d7">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <DigestValue>DigestValueGoesHere!</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>SignatureValueGoesHere!
        </SignatureValue>
        <KeyInfo>
            <X509Data>
              <X509Certificate>X509CertificateGoesHere!</X509Certificate>
            </X509Data>
        </KeyInfo>
    </Signature>
</saml2p:LogoutRequest>

For that purpose, I've created some extensions which I'm trying to use to test the XML :

public static class XmlExtensions
    {
        public static XmlNode Signature(this XmlDocument document)
        {
            return document.SelectSingleNodeFromDocumentRoot(@"/saml2p:LogoutRequest/Signature");
        }

        private static XmlNode SelectSingleNodeFromDocumentRoot(this XmlDocument document, string path)
        {
            var ns = new XmlNamespaceManager(document.NameTable);

            ns.AddNamespace("saml2", @"urn:oasis:names:tc:SAML:2.0:assertion");
            ns.AddNamespace("saml2p", @"urn:oasis:names:tc:SAML:2.0:protocol");
            ns.AddNamespace("ns1", @"http://www.w3.org/2000/09/xmldsig#");

            var result = document.SelectSingleNode(path, ns);
            return result;
        }
    }

In one of my tests, I'm attempting to retrieve the /saml2p:LogoutRequest/Signature element, however my extensions are returning null. Why? I thought I should use a supplied ns manager with xml namespaces added to it? Please note that the query path works perfect in XPath Visualizer Tool.

like image 995
Maciek Avatar asked Jul 23 '26 06:07

Maciek


1 Answers

Signature is in namespace xmlns="http://www.w3.org/2000/09/xmldsig#", so you need to adjust:

return document.SelectSingleNodeFromDocumentRoot(@"/saml2p:LogoutRequest/ns1:Signature");
like image 66
StuartLC Avatar answered Jul 25 '26 19:07

StuartLC



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!