usar por espaƱol ejemplo como buscar atributo c# xml soap cryptography xml-signature

c# - por - id css ejemplo



''Elemento de referencia con formato incorrecto'' al agregar una referencia basada en un atributo Id con la clase SignedXml (4)

Debe tenerse en cuenta que deberá usar el objeto SignedXmlWithId lugar del objeto SignedXml para poder usar el método GetIdElement() anulado. Una vez que hice eso, pude firmar un elemento XmlElement y sortear el error del elemento de referencia con formato incorrecto.

Vea mi post sobre este tema aquí .

No se puede firmar el elemento por el atributo Id cuando hay un prefijo de espacio de nombres:

void Main() { var doc = new XmlDocument(); doc.LoadXml("<root xmlns:u=/"myuri/"><test u:Id=/"_0/">Zebra</test></root>"); SignedXml signedXml = new SignedXml(doc); signedXml.SigningKey = new RSACryptoServiceProvider(); Reference reference = new Reference("#_0"); signedXml.AddReference(reference); signedXml.ComputeSignature(); }

ComputeSignature() fallará aquí con ''Elemento de referencia con ComputeSignature() '' ¿cómo se debe hacer esto?


El enfoque que utilizamos fue la subclase System.Security.Cryptography.Xml.SignedXml class ...

public class SignedXmlWithId : SignedXml { public SignedXmlWithId(XmlDocument xml) : base(xml) { } public SignedXmlWithId(XmlElement xmlElement) : base(xmlElement) { } public override XmlElement GetIdElement(XmlDocument doc, string id) { // check to see if it''s a standard ID reference XmlElement idElem = base.GetIdElement(doc, id); if (idElem == null) { XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); idElem = doc.SelectSingleNode("//*[@wsu:Id=/"" + id + "/"]", nsManager) as XmlElement; } return idElem; } }


SignedXml no reconoce u: Id como una ID XML válida, y la Firma XML requiere que sea una ID XML.

Puede usar el esquema (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd si está tratando de usar un Id. De seguridad WS) o añadir una DTD al fragmento XML. (]> para un fragmento XML). Agregar una DTD solo a su LoadXml hará que SignedXml reconozca la identificación, pero como SOAP no permite las DTD, no incluya la DTD en su SOAP en el cable.


referencia var = referencia nueva (""); // Esto firmará todo el documento.