Dazu verwenden wir die Klasse SignedXml (System.Security.Cryptography.Xml) in C#. Was in den meisten Fällen gut funktioniert.
Bei einigen XML-Antworten schlägt die Validierung mit SignedXML fehl. Der Unterschied zwischen den fehlgeschlagenen und den nicht fehlgeschlagenen scheint in der Verwendung dynamischer Namespace-Präfixe (ns1-ns5) zu liegen.
Wenn wir das Online-Tool von Chillkat zur Validierung verwenden, validieren sie es als gültig https://tools.chilkat.io/xmlDsigVerify
Unten eine vereinfachte Implementierung unseres Codes und 1 erfolgreiche und 1 fehlgeschlagene (öffentliche) URL.
Jeder weiß wie Um dieses Problem zu lösen, verwenden Sie die SignedXml-Klasse?
Code: Select all
internal class Program
{
static async Task Main()
{
var failingUrl = "http://smp.peppol.comax.be/iso6523-actorid-upis%3A%3A0208%3A0468863455/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-2%3A%3AInvoice%23%23urn%3Acen.eu%3Aen16931%3A2017%23compliant%23urn%3Afdc%3Apeppol.eu%3A2017%3Apoacc%3Abilling%3A3.0%3A%3A2.1";
var successUrl = "http://smp.peppol.org/iso6523-actorid-upis%3A%3A9925%3Abe0848934496/services/busdox-docid-qns%3A%3Aurn%3Afdc%3Apeppol%3Aend-user-statistics-report%3A1.1%3A%3AEndUserStatisticsReport%23%23urn%3Afdc%3Apeppol.eu%3Aedec%3Atrns%3Aend-user-statistics-report%3A1.1%3A%3A1.1";
await Validate(failingUrl);
await Validate(successUrl);
async Task Validate(string url)
{
try
{
var content = await new HttpClient().GetStringAsync(url);
var xmlDocument = new XmlDocument();
xmlDocument.PreserveWhitespace = true;
xmlDocument.LoadXml(content);
// Validate the XML signature
bool isValid = ValidateXmlSignature(xmlDocument);
if(isValid)
{
Console.WriteLine("✓ XML signature is VALID");
}
else
{
Console.WriteLine("✗ XML signature is INVALID");
}
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
}
static bool ValidateXmlSignature(XmlDocument xmlDoc)
{
// Find the Signature element in the XML document
var signatureNode = xmlDoc.GetElementsByTagName("Signature", "http://www.w3.org/2000/09/xmldsig#");
if(signatureNode.Count == 0)
{
Console.WriteLine("No signature found in the XML document.");
return false;
}
try
{
// Load the signature
var signedXml = new SignedXml(xmlDoc);
signedXml.LoadXml((XmlElement)signatureNode[0]);
// Verify the signature
bool isValid = signedXml.CheckSignature();
return isValid;
}
catch (Exception ex)
{
Console.WriteLine($"Error during signature validation: {ex.Message}");
return false;
}
}
}
Mobile version