SignedXml xml नामस्थान विशेषताएँ ठीक प्रकार से हैंडल नहीं


लक्षण


SignedXml वर्ग द्वारा निम्नलिखित जैसे कि एक xml हस्ताक्षर सत्यापित नहीं किया जा सकता।

<tns:CertificateStatusResponse xmlns="" xmlns:dpfunc="http://www.datapower.com/extensions/functions" xml:id="response">
<tns:ReturnCode>00</tns:ReturnCode>
<tns:ReturnText>OK</tns:ReturnText>
<tns:CertificateStatus>
  <tns:CertificateSerialNo>3419000000001401</tns:CertificateSerialNo>
  <tns:CertificateType>signing</tns:CertificateType>
  <tns:MatchingCertificateSerialNo>3419000000001402</tns:MatchingCertificateSerialNo>
  <tns:Status><tns:revoked revocationDate="2011-01-21T10:12:04Z" CRLReason="1"/></tns:Status>
</tns:CertificateStatus>
<tns:Timestamp>2011-02-02T14:53:47Z</tns:Timestamp>
<tns:RequestId>hls=</tns:RequestId>
< हस्ताक्षर xmlns = "http://www.w3.org/2000/09/xmldsig#" >
<SignedInfo>
< CanonicalizationMethod एल्गोरिथम = "http://www.w3.org/2001/10/xml-exc-c14n#" />
< SignatureMethod एल्गोरिथम = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
< संदर्भ URI "#response" = >
    <Transforms>
< रूपांतरण एल्गोरिथ्म = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
< रूपांतरण एल्गोरिथ्म = "http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
< DigestMethod एल्गोरिथम = "http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue>4hTmTRbInGChuyeqoRs06Tug30s=</DigestValue>
  </Reference>
</SignedInfo>
<SignatureValue>jHG4+lRvqs1g8ZRLCdND7lT7qFQr6YnzQ...</SignatureValue>
<KeyInfo>
 <X509Data>
   <X509Certificate>MIIEADCCAuigAwIBAgIFAMa3vBEwDQYJKoZIhvcNAQELB...</X509Certificate>
  </X509Data>
</KeyInfo>
</Signature>
</tns:CertificateStatusResponse>

कारण


हस्ताक्षर सत्यापित करने के लिए SignedXml.CheckSignature() का प्रयास करने पर यह canonicalizes SignedInfo नोड और गलत xml नामस्थान विशेषताएँ इनहेरिट करता है। इस मामले में जो नहीं होना चाहिए और हस्ताक्षर को अमान्य करती SignedInfo नीचे xml:id ली गई है।

समाधान


.NET 4.0, में यह canonicalization एल्गोरिथम के लिए कोई कस्टम ट्रांस्फ़ॉर्म का पंजीकरण किया जा सकता है। कस्टम ट्रांस्फ़ॉर्म अंतर्निहित Exc14N ट्रांस्फ़ॉर्म करने के लिए प्रतिनिधि, और धारियाँ xml नाम स्थान विशेषता है।

कस्टम ट्रांस्फ़ॉर्म वर्ग बहुत छोटा है और सीधे आगे है।
सार्वजनिक वर्ग MyXmlDsigExcC14NTransform: XmlDsigExcC14NTransform
{
सार्वजनिक MyXmlDsigExcC14NTransform() {

सार्वजनिक, void LoadInput(Object obj) ओवरराइड करें
   {           
XmlElement रूट = ((XmlDocument) obj)। DocumentElement;
अगर (रूट। नाम = "SignedInfo" =) रूट। RemoveAttribute("xml:id");
आधार है। LoadInput(obj);
   }
}

आपके अनुप्रयोग की शुरुआत MyXmlDsigExcC14NTransform निम्न कॉल के साथ पंजीकृत किया जा सकता:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");

SignedXml.CheckSignature() कहा जाता है, जब MyXmlDsigExcC14NTransform canonicalization धारियाँ xml:id विशेषता है जो करने के लिए कहा जाता है।