'Malformed Reference Element' when adding a reference based on an Id attribute with SignedXml class 'Malformed Reference Element' when adding a reference based on an Id attribute with SignedXml class xml xml

'Malformed Reference Element' when adding a reference based on an Id attribute with SignedXml class


The approach we used was to subclass 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;    }}


var reference = new Reference(""); // This will sign the entire document


It should be noted that you will need to use SignedXmlWithId object instead of SignedXml object in order to be able to use the overridden GetIdElement() method. Once I did that, I was able to sign an XmlElement and get around the Malformed Reference Element error.

See my post about this topic here.