2012-08-27 75 views
0

Internet上的所有examples都顯示XmlDsigEnvelopedSignatureTransform類作爲SignedXml類的一部分的用法。如何使用XmlDsigEnvelopedSignatureTransform獨立於SignedXml類

我想單獨使用這個類。只需給它一個nodeList即可得到沒有簽名節點的結果。

XmlDsigEnvelopedSignatureTransform envSigTrans = new XmlDsigEnvelopedSignatureTransform(); 
envSigTrans.LoadInput(xmlDocument.DocumentElement.SelectNodes("//*")); 
XmlNodeList nodeList = (XmlNodeList)envSigTrans.GetOutput(typeof(XmlNodeList)); 

但是輸出nodeList仍然包含我想擺脫的ds:Signature節點。

這樣做的正確方法是什麼?非常感謝您的幫助。

回答

2

剛剛進入同樣的問題我自己。原來,如果您使用XmlDsigEnvelopedSignatureTransform「原樣」,您將始終獲得所有節點。我已經在反射器中跟蹤了XmlDsigEnvelopedSignatureTransform,並且只有在_signaturePosition中有值時纔會刪除簽名。這是一個私有的API,但只有MS使用intertnally(通過SignedInfo),所以大XmlDsigEnvelopedSignatureTransform作爲用戶並非有用。好消息是你可以通過私人反射手動設置它。如果你的Xml只有一個簽名元素,它的值應該總是一個。

var transform = new XmlDsigEnvelopedSignatureTransform(false); 
    transform.LoadInput(xmldoc);   
    FieldInfo field = transform.GetType().GetField("_signaturePosition", 
        BindingFlags.NonPublic | 
        BindingFlags.Instance); 
    field.SetValue(transform, 1);     
    var res = (XmlDocument)t.GetOutput(); 
    var str = res.OuterXml;