while generating digital signature with sha256 algorithm showing malformed reference element on signedxml.computesignature.
Code :- Algorithm is SHA256
private SignedXml Sign(XmlDocument doc,string LogoutResponseID)
{
doc.PreserveWhitespace = true;
var TimestampID = Guid.NewGuid().ToString();
X509Certificate2 cert=new X509Certificate2();
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindByThumbprint, CertThumbprint, false);
if (certificates.Count == 0)
{
// "Certificate not installed."
}
else
{
cert = certificates[0];
}
store.Close();
MySignedXml signed = new MySignedXml(doc) { SigningKey = cert.GetRSAPrivateKey() };
//MySignedXml signed = new MySignedXml(doc.DocumentElement);
//signed.SigningKey = cert.PrivateKey;
string signatureCanonicalizationMethod = "";
string signatureMethod = "";
string digestMethod = "";
signed.SignedInfo.CanonicalizationMethod = signatureCanonicalizationMethod;
signed.SignedInfo.SignatureMethod = signatureMethod;
XmlDsigEnvelopedSignatureTransform envelopeTransform = new XmlDsigEnvelopedSignatureTransform();
envelopeTransform.Algorithm = SignedXml.XmlDsigEnvelopedSignatureTransformUrl;
XmlUrlResolver xmlresolver = new XmlUrlResolver();
xmlresolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform();
cn14Transform.Algorithm = SignedXml.XmlDsigExcC14NTransformUrl;
var signatureReference = new Reference() { Uri = "#"+ LogoutResponseID };
//signatureReference.Uri = "#"+ signed.GetIdElement(doc, LogoutResponseID);
signatureReference.AddTransform(envelopeTransform);
signatureReference.AddTransform(cn14Transform);
signatureReference.DigestMethod = digestMethod;
signed.AddReference(signatureReference);
signed.ComputeSignature();
return signed;
}
internal sealed class MySignedXml : SignedXml
{
public MySignedXml(XmlDocument xml)
: base(xml)
{
}
public MySignedXml(XmlElement xmlElement)
: base(xmlElement)
{
}
public override XmlElement GetIdElement(XmlDocument doc, string ID)
{
XmlElement idElem = base.GetIdElement(doc, ID);
if (idElem == null)
{
XmlNamespaceManager xMan = new XmlNamespaceManager(doc.NameTable);
xMan.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
idElem = doc.SelectSingleNode("/samlp:LogoutResponse/@ID='{ID}'", xMan) as XmlElement;
}
return idElem;
}
}
Jayraj ChhayaPosted Jan 29, 2024, 12:35 PM
Cause
The cause of the error is likely due to incorrect usage of the
GetIdElementmethod in theMySignedXmlclass. The code is attempting to select theLogoutResponseelement using an XPath expression, but the expression is not correctly formatted.Solution
To fix the issue, we need to modify the
GetIdElementmethod in theMySignedXmlclass to correctly select theLogoutResponseelement.Replace the following line of code:
With the following line of code:
This change will select any element in the XML document that has an
IDattribute matching the providedIDparameter.