2014-05-14 2 views
0

XMLDSig에 대해 새로운 점이 있습니다. 내 XML에 서명해야합니다. 내가 속한 프로젝트에서 XSD에 대한 XML의 유효성을 서명 전에 확인하고 서명 후에 확인해야합니다.XSD - xmldsig로 서명 된 XML 유효성 확인

XSD에 대해 너무 많이 알지는 못하지만 여기서는 다른 XSD로 가져 오기가 있습니다. 그리고 그것이 내 문제가 시작되는 곳입니다. 내 XSD 파일은 masive.xsd이며 이것이 시작 부분을 보는 방법입니다. 내 코드를 C#으로

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
    elementFormDefault="qualified"> 
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" 
     schemaLocation="xmldsig-core-schema.xsd"/> 

나는 XSD에 대해 XML 유효성을 검사 할 때 발견 된 오류를 보여주기 때문에 작품을, 내가 인터넷에서 발견 된 몇 가지 코드를 사용합니다. 그러나 서명 된 XML의 유효성을 검사하려고 할 때 내 문제가 시작됩니다.

변경하지 않고 클래스를 그대로 사용합니다. 내가 함수 pathSchema와 스키마를 추가 할 때 :

SchemaSet.Add(null, pathSchema); //pathSchema is the path where my xsd file is. 

이 오류를 얻을 :

: 내가 옳다 경우 서명 XML을 다음과 같은 몇 가지 태그를 가지고 있기 때문에

The 'http://www.w3.org/2000/09/xmldsig#:Signature' element is not declared. 

이있다

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-aae8151c-b8db-4525-bfb1-0b3cebdd1dbf"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> 
<ds:Reference URI="#xmldsig-aae8151c-b8db-4525-bfb1-0b3cebdd1dbf-keyinfo"> 
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
<ds:DigestValue>p4U9Np1nKtjWPPwp2mOcIimRjUy+RuQIPr2hVdY5R2E=</ds:DigestValue> 
</ds:Reference> 

이전에 일부 게시물을 읽었습니다. 수동으로 XSD를 추가 한 사람을 읽었습니다. 그래서 XSD를 다운로드하고 로컬 경로에 투입 한 다음 내 코드에 추가 :

XElement xsdMarkup2 = XElement.Load(@"C:\XMLXSD\xmldsig-core-schema.xsd"); 
    settings.Schemas.Add(null, xsdMarkup2.CreateReader()); 

그리고 오류 "서명 요소가 선언되지 않았습니다"표시되지 않습니다. 그러나 유효성 검사기는 더 이상 서명 된 XML의 유효성을 검사하지 않습니다. 나는 몇몇 꼬리표를 삭제하고 종류는 말했다 : No error. 그러나 거기에 있었다.

답변

0

좋아, 마침내 해결할 수있었습니다.

이 솔루션을 사용했는데, 이것은 다양한 솔루션의 혼합입니다. xmldsig-core-schema.xsd를 다운로드하고 편집합니다. xml의 유효성을 검사하려고했을 때 xsd 스키마의 첫 번째 줄은 이와 같아야한다는 주석을 던지는 주석이있는 줄이 일부 있기 때문에

<schema xmlns="http://www.w3.org/2001/XMLSchema" 

음이

   XmlSchemaSet ss = new XmlSchemaSet(); 
       ss.Add(null, @"C:\Masive.xsd"); 

       XmlReaderSettings settings2 = new XmlReaderSettings(); 
       settings2.DtdProcessing = DtdProcessing.Parse; 

       XmlReader reader = XmlReader.Create(@"C:\xmldsig-core-schema.xsd", settings2); 

       ss.Add(null, reader); 
       ss.Compile(); 

내가이 그것을 할 수있는 최선의 방법 (내 생각)하지 확신 C#에서 코드의 일부이다하지만 나를 위해 일했다.