public void FindIdElement()
        {
            var tests = new[] {
                "<{0} {2}='{1}'></{0}>",
                "<{0} {2}='{1}'></{0}>",
                "<{0} {2}='{1}'></{0}>",
                "<container><{0} {2}='{1}'></{0}></container>",
                "<container><invalid Id='notThis' /><{0} {2}='{1}'></{0}></container>",
                "<container><invalid ID='notThis'><{0} {2}='{1}'></{0}></invalid></container>",
                "<container xmlns='http://example.org'><{0} {2}='{1}'></{0}></container>",
                "<a:container xmlns:a='http://example.org'><{0} {2}='{1}'></{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><a:{0} {2}='{1}'></a:{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><b:{0} xmlns:b='http://nowhere.com' {2}='{1}'></b:{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><{0} xmlns='' {2}='{1}'></{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><{0} xmlns='' a:{2}='{1}'></{0}></a:container>"
            };

            foreach (var item in tests)
            {
                foreach (var id in new string[] { "Id", "ID", "id" })
                {
                    var xml = new XmlDocument()
                    {
                        PreserveWhitespace = true
                    };
                    xml.LoadXml(string.Format(item, "element", "value", id));

                    var signed   = new SignedXmlWithAgnosticId(xml);
                    var response = signed.GetIdElement(xml, "value");

                    Assert.IsNotNull(response);
                    Assert.IsTrue(response.Attributes.OfType <XmlAttribute>().Any(a => a.LocalName == id && a.Value == "value"));
                }
            }
        }
        public void FindIdElement()
        {
            var tests = new[] {
                "<{0} {2}='{1}'></{0}>",
                "<{0} {2}='{1}'></{0}>",
                "<{0} {2}='{1}'></{0}>",
                "<container><{0} {2}='{1}'></{0}></container>",
                "<container><invalid Id='notThis' /><{0} {2}='{1}'></{0}></container>",
                "<container><invalid ID='notThis'><{0} {2}='{1}'></{0}></invalid></container>",
                "<container xmlns='http://example.org'><{0} {2}='{1}'></{0}></container>",
                "<a:container xmlns:a='http://example.org'><{0} {2}='{1}'></{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><a:{0} {2}='{1}'></a:{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><b:{0} xmlns:b='http://nowhere.com' {2}='{1}'></b:{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><{0} xmlns='' {2}='{1}'></{0}></a:container>",
                "<a:container xmlns:a='http://example.org'><{0} xmlns='' a:{2}='{1}'></{0}></a:container>"};

            foreach (var item in tests)
            {
                foreach (var id in new string[] { "Id", "ID", "id" })
                {
                    var xml = new XmlDocument() { PreserveWhitespace = true };
                    xml.LoadXml(string.Format(item, "element", "value", id));

                    var signed = new SignedXmlWithAgnosticId(xml);
                    var response = signed.GetIdElement(xml, "value");

                    Assert.IsNotNull(response);
                    Assert.IsTrue(response.Attributes.OfType<XmlAttribute>().Any(a => a.LocalName == id && a.Value == "value"));
                }
            }
        }
示例#3
0
        private void IdNodeMatcher(SignedXmlWithAgnosticId signedXml, string elementId, XmlNodeList nodes,
                                   string elementXPath)
        {
            var targetNode = signedXml.GetIdElement(ResponseContainer.Envelope, elementId);

            if (targetNode != nodes[0])
            {
                throw new ValideringsException($"Signaturreferansen med id '{elementId}' må referere til node med sti '{elementXPath}'");
            }
        }
        /// <summary>
        /// Sjekker at soap envelopen inneholder timestamp, body og messaging element med korrekt id og referanser i security signaturen.
        /// </summary>
        private void ValiderInnhold(XmlElement signature, SignedXmlWithAgnosticId signedXml)
        {
            string[] requiredSignatureElements = { "/env:Envelope/env:Header/wsse:Security/wsu:Timestamp", "/env:Envelope/env:Body", "/env:Envelope/env:Header/eb:Messaging" };

            foreach (var elementXPath in requiredSignatureElements)
            {
                // Sørg for at svar inneholde påkrevede noder.
                var nodes = responseDocument.SelectNodes(elementXPath, nsMgr);
                if (nodes == null || nodes.Count == 0)
                {
                    throw new Exception(string.Format("Kan ikke finne påkrevet element '{0}' i svar fra meldingsformidler.", elementXPath));
                }
                if (nodes.Count > 1)
                {
                    throw new Exception(string.Format("Påkrevet element '{0}' kan kun forekomme én gang i svar fra meldingsformidler. Ble funnet {1} ganger.", elementXPath, nodes.Count));
                }

                // Sørg for at det finnes en refereanse til node i signatur element
                var elementId = nodes[0].Attributes["wsu:Id"].Value;

                var references = signature.SelectNodes(string.Format("./ds:SignedInfo/ds:Reference[@URI='#{0}']", elementId), nsMgr);
                if (references == null || references.Count == 0)
                {
                    throw new Exception(string.Format("Kan ikke finne påkrevet refereanse til element '{0}' i signatur fra meldingsformidler.", elementXPath));
                }
                if (references.Count > 1)
                {
                    throw new Exception(string.Format("Påkrevet refereanse til element '{0}' kan kun forekomme én gang i signatur fra meldingsformidler. Ble funnet {1} ganger.", elementXPath, references.Count));
                }

                // Sørg for at Id node matcher
                var targetNode = signedXml.GetIdElement(responseDocument, elementId);
                if (targetNode != nodes[0])
                {
                    throw new Exception(string.Format("Signaturreferansen med id '{0}' må refererer til node med sti '{1}'", elementId, elementXPath));
                }
            }
        }
        /// <summary>
        /// Sjekker at soap envelopen inneholder timestamp, body og messaging element med korrekt id og referanser i security signaturen.
        /// </summary>
        private void ValiderInnhold(XmlElement signature, SignedXmlWithAgnosticId signedXml)
        {
            string[] requiredSignatureElements = { "/env:Envelope/env:Header/wsse:Security/wsu:Timestamp", "/env:Envelope/env:Body", "/env:Envelope/env:Header/eb:Messaging" };

            foreach (var elementXPath in requiredSignatureElements)
            {
                // Sørg for at svar inneholde påkrevede noder.
                var nodes = responseDocument.SelectNodes(elementXPath, nsMgr);
                if (nodes == null || nodes.Count == 0)
                    throw new Exception(string.Format("Kan ikke finne påkrevet element '{0}' i svar fra meldingsformidler.", elementXPath));
                if (nodes.Count > 1)
                    throw new Exception(string.Format("Påkrevet element '{0}' kan kun forekomme én gang i svar fra meldingsformidler. Ble funnet {1} ganger.", elementXPath, nodes.Count));

                // Sørg for at det finnes en refereanse til node i signatur element
                var elementId = nodes[0].Attributes["wsu:Id"].Value;

                var references = signature.SelectNodes(string.Format("./ds:SignedInfo/ds:Reference[@URI='#{0}']", elementId), nsMgr);
                if (references == null || references.Count == 0)
                    throw new Exception(string.Format("Kan ikke finne påkrevet refereanse til element '{0}' i signatur fra meldingsformidler.", elementXPath));
                if (references.Count > 1)
                    throw new Exception(string.Format("Påkrevet refereanse til element '{0}' kan kun forekomme én gang i signatur fra meldingsformidler. Ble funnet {1} ganger.", elementXPath, references.Count));

                // Sørg for at Id node matcher
                var targetNode = signedXml.GetIdElement(responseDocument, elementId);
                if (targetNode != nodes[0])
                    throw new Exception(string.Format("Signaturreferansen med id '{0}' må refererer til node med sti '{1}'", elementId, elementXPath));
            }
        }
 private XmlElement GetTargetNode(string elementId)
 {
     return(_signedXmlWithAgnosticId.GetIdElement(ResponseMessage, elementId));
 }
        private XmlElement HentMålnode(string elementId)
        {
            var targetNode = _signedXmlWithAgnosticId.GetIdElement(Respons, elementId);

            return(targetNode);
        }