验证签名时SignedXml无法正常工作

时间:2015-03-12 10:20:14

标签: .net casting verify xml-dsig signedxml

使用 SignedXml this Microsoft's example来验证签名,但由于转换 XmlElement

Boolean VerifyDetachedSignature( String^ XmlSigFileName )
{

   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;

   // Load the passed XML file into the document.
   xmlDocument->Load( XmlSigFileName );

   // Create a new SignedXMl object.
   SignedXml^ signedXml = gcnew SignedXml;

   // Find the "Signature" node and create a new 
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" );

   // Load the signature node.
   signedXml->LoadXml( safe_cast<XmlElement^>(nodeList->Item( 0 )) );

   // Check the signature and return the result. 
   return signedXml->CheckSignature();
}

由于&#34;没有工作&#34;我的意思是,即使我删除了引用文件(签名XML 文件中的引用中引用的文件),它也没有抛出任何异常。这意味着它只是没有检查它们。

但是当我用这种方式初始化 signedXml 时:

   SignedXml^ signedXml = gcnew SignedXml(xmlDococument);
   signedXml->LoadXml(xmlDococument->DocumentElement);

   //xmlDococument->DocumentElement is an XmlElement

它可以完美地工作,无法在找不到引用文件时抛出异常并返回&#34; true&#34;找到所有引用文件时的值(因为签名正确)。

这意味着在将XmlNode强制转换为XmlElement 时会发生错误,即使它确实(尽管它确实返回了我需要的节点)。我甚至尝试用XmlWriter编写它并得到我需要的东西。

问题是我需要执行强制转换XmlNode到XmlElement 的方式,因为我正在使用的XML文件有签名< / strong>元素在树下面(也就是说,它不是根节点),我需要使用 SelectSingleNode GetItemByTagName 。我怎么能解决这个问题?

0 个答案:

没有答案