使用 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 。我怎么能解决这个问题?