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")); } } }
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); }