2011-02-24 9 views
14

जब वहाँ एक नामस्थान उपसर्ग आईडी विशेषता द्वारा तत्व प्रवेश करने में असमर्थ:'विकृत संदर्भ तत्व' जब SignedXml वर्ग के साथ एक आईडी विशेषता के आधार पर एक संदर्भ जोड़ने

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() 'विकृत संदर्भ तत्व' के साथ यहाँ असफल हो जायेगी यह कैसे किया जाना चाहिए?

उत्तर

31

दृष्टिकोण हम इस्तेमाल किया System.Security.Cryptography.Xml.SignedXml वर्ग ... उपवर्ग के लिए गया था

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; 
    } 
} 
+1

आप आज के लिए मेरे नायक हैं। धन्यवाद। – Bon

+1

मुझे एक ही त्रुटि थी, लेकिन समस्या यह थी कि सिक्योरपार्ट \ आईडी के लिए मूल्य संख्या के साथ शुरू हुआ (केवल वर्णों की अनुमति है)। –

+1

@ जेनफ्रेड्रिच आपको एक कामकाजी उत्तर पोस्ट करना चाहिए, अगर मैं सही हूं तो मैं स्वीकार करूंगा। –

3

var संदर्भ = नया संदर्भ (""); // यह पूरे दस्तावेज़ पर हस्ताक्षर करेगा

+1

लेकिन मुझे हस्ताक्षर करने के लिए तत्व की आईडी की आपूर्ति करने की आवश्यकता है .. वास्तविक एक्सएमएल एक साबुन लिफाफा है और आईडी का उपयोग करने का तरीका यह है कि यह किया गया है। –

+0

ठीक है, एक्सएमएल ने "यू: आईडी" को अटूट किया है, यदि आप इसे " ..." में बदलते हैं, तो ComputeSignature को काम करना चाहिए। यदि आप इनपुट नहीं बदल सकते हैं तो आप "#xpointer" संदर्भ का उपयोग करेंगे। –

0

साइनएडएक्सएमएल आपको पहचान नहीं करता है: आईडी एक वैध एक्सएमएल आईडी के रूप में, और एक्सएमएल हस्ताक्षर के लिए इसे एक एक्सएमएल आईडी होना आवश्यक है।

या तो आप स्कीमा (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd का उपयोग कर सकते हैं यदि आप डब्लूएस- सुरक्षा आईडी) या एक्सएमएल खंड में एक डीटीडी जोड़ें। (]> एक एक्सएमएल टुकड़े के लिए)। केवल आपके लोडएक्सएमएल में डीटीडी जोड़ना सिग्डेक्सएमएल आईडी को पहचान देगा, लेकिन चूंकि एसओएपी डीटीडी की अनुमति नहीं देता है, तो अपने ऑन-द-वायर एसओएपी में डीटीडी शामिल न करें।

2

यह ध्यान देने योग्य है कि आप क्रम में SignedXml वस्तु के स्थान पर SignedXmlWithId वस्तु का उपयोग करने के अधिरोहित GetIdElement() विधि का उपयोग करने में सक्षम होने की आवश्यकता होगी । एक बार ऐसा करने के बाद, मैं XmlElement पर हस्ताक्षर करने में सक्षम था और विकृत संदर्भ तत्व त्रुटि के आसपास मिलता हूं।

See my post about this topic here

+0

अच्छा काम कुछ प्रतिनिधि है ... :) –

संबंधित मुद्दे