2016-09-15 5 views
0

소스 코드가없는 사용자 정의 SAML 2 라이브러리를 WIF와 교체하려고하는데, 이에 대해서는 경험이 없습니다. 예제 코드를 찾는 데 운이 없기 때문에 시행 착오의 스타일을 사용하고 있습니다. 코드가 거의 작동하는 것처럼 보입니다. 그러나 나는 매우 간결한 The signature verification failed. 메시지와 다른 것을 얻지 못합니다.Windows Identity Foundation을 사용하여 SAML 2 어설 션 유효성을 검증하지 못했습니다.

이 프로세스에 대한 입력을 위해 X509 인증서와 base-64로 인코딩 된 SAML 2 어설 션이 있습니다.

내 코드는;

// Load X509 certificate 
string rootPath = System.AppDomain.CurrentDomain.BaseDirectory; 
string certFilePath = ConfigurationManager.AppSettings["SAMLCertLocation"]; 
certFilePath = Path.Combine(rootPath, certFilePath); 
msg = string.Format("SAMLCertLocation: [{0}]", certFilePath); 
Trace.TraceInformation(msg); 
X509Certificate2 cert = new X509Certificate2(certFilePath, String.Empty); 

// build token handler configuration 
List<System.IdentityModel.Tokens.SecurityToken> serviceTokens = new List<System.IdentityModel.Tokens.SecurityToken>(); 
serviceTokens.Add(new System.IdentityModel.Tokens.X509SecurityToken(cert)); 

ConfigurationBasedIssuerNameRegistry issuers = new ConfigurationBasedIssuerNameRegistry(); 
issuers.AddTrustedIssuer(cert.Thumbprint, cert.Issuer); 

SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration() 
{ 
    AudienceRestriction = { AudienceMode = AudienceUriMode.Never }, 
    CertificateValidator = X509CertificateValidator.None,    
    // RevocationMode = X509RevocationMode.NoCheck,    // no such property 
    IssuerNameRegistry = issuers, 
    MaxClockSkew = TimeSpan.FromMinutes(5), 
    ServiceTokenResolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(serviceTokens.AsReadOnly(), false) 
}; 

// extract the assertion from the request 
byte[] data = Convert.FromBase64String(reqstr); 
string assertion = Encoding.UTF8.GetString(data); 
Trace.TraceInformation(assertion); 

// read and validate the assertion 
Saml2SecurityTokenHandler handler = new Saml2SecurityTokenHandler(); 
handler.Configuration = config; 
bool canReadToken = handler.CanReadToken(XmlReader.Create(new StringReader(assertion))); 
msg = string.Format("CanReadToken [{0}]", canReadToken); 
Trace.TraceInformation(msg); 
if (canReadToken) 
{ 
    try 
    { 
     System.IdentityModel.Tokens.SecurityToken token = handler.ReadToken(XmlReader.Create(new StringReader(assertion))); 
     ClaimsIdentityCollection claims = handler.ValidateToken(token); 
     msg = string.Format("SAML Claims [{0}]", claims.ToString()); 
     Trace.TraceInformation(msg); 
    } 
    catch (Exception e) 
    { 
     msg = string.Format("Validation Exception [{0}]", e.Message); 
     Trace.TraceInformation(msg); 
    } 
} 

나가는 오류는 다음과 같습니다.

2016-09-15T19:34:39 PID[6504] Information CanReadToken [True] 
2016-09-15T19:34:39 PID[6504] Information Validation Exception [ID6013: The signature verification failed.] 
2016-09-19T13:13:13 PID[11912] Information Validation Exception [System.Security.Cryptography.CryptographicException: ID6013: The signature verification failed. 
    at Microsoft.IdentityModel.Protocols.XmlSignature.SignedXml.VerifySignature(HashAlgorithm hash, AsymmetricSignatureDeformatter deformatter, String signatureMethod) 
    at Microsoft.IdentityModel.Protocols.XmlSignature.SignedXml.StartSignatureVerification(SecurityKey verificationKey) 
    at Microsoft.IdentityModel.Protocols.XmlSignature.EnvelopedSignatureReader.OnEndOfRootElement() 
    at Microsoft.IdentityModel.Protocols.XmlSignature.EnvelopedSignatureReader.Read() 
    at System.Xml.XmlReader.ReadEndElement() 
    at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ReadAssertion(XmlReader reader) 
    at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ReadToken(XmlReader reader) 
    at AXAWeb.Code.Saml20Login.Saml20Login.SamlLogon(String samlString, String absoluteUrl) in Saml20Login.cs:line 189] 

어설 션의 서명 섹션은 다음과 같습니다.

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
    <Reference URI="#SAML-a964f232-77ab-40d1-a74a-f85dfe10f57d"> 
     <Transforms> 
     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
     <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
     <DigestValue>B9q+BrqH+Fq74R8eCqd+Vd+vKkw=</DigestValue> 
    </Reference> 
    </SignedInfo> 
    <SignatureValue>...snip for brevity...</SignatureValue> 
    <KeyInfo> 
    <X509Data> 
     <X509Certificate>...snip for brevity...</X509Certificate> 
    </X509Data> 
    <X509Data> 
     <X509IssuerSerial> 
     <X509IssuerName>CN=Entrust Certification Authority - L1K, OU="(c) 2012 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US</X509IssuerName> 
     <X509SerialNumber>1356031830</X509SerialNumber> 
     </X509IssuerSerial> 
    </X509Data> 
    </KeyInfo> 
</Signature> 

는 내가 구성에서 뭔가를 누락 기대, 그래서 나는 this question의 정보를 기반으로 변화를 삽입했다. 그러나 결과는 바뀌지 않았습니다.

경험이있는 사람이라면 누구나 내가이 작품을 만들기 위해 무엇을 추가해야하는지 알고 있습니까?

+0

하지 마십시오 인쇄 : 당신이 서명을 검증하기위한 올바른 인증서를 연결할 경우, 당신이 사용하는 주장에 대한 서명을 검증 할 수 있는지 확인하기 위해 다른 두 가지 System.Security.Cryptography.Xml.SignedXml입니다 예외. 메시지 만. 전체 예외를 인쇄하십시오. 자세한 정보를 얻으려면 String()을 사용하십시오. 그것을 바탕으로 누군가가 당신에게 더 많은 도움을 줄 수있을 것입니다 :) – Thuan

+0

@ Thuan - 제안에 감사드립니다. 위의 새로운 정보가 추가되었습니다. – CAB

+0

정말이 모듈을 교체해야합니까, 아니면 IIS 응용 프로그램이나 그와 비슷한 것을 인증 하시겠습니까? – TGlatzer

답변

3

WIF의 서명 유효성 검사의 매우 성가신 문제는 추적을 지원하지 않는 SignedXml의 내부 구현을 사용한다는 것입니다. 기록을 위해 공개 System.Security.Cryptography.Xml.SignedXml은 추적을 지원하므로 잘못 된 항목을 찾는 것이 더 쉽습니다. 어쨌든, 내 경험상, 어설 션 xml에 공백이 있는지 확인하는 것이 좋습니다. 그렇다면 XmlReader로 읽을 때 PreserveWhiteSpaces 설정을 사용해야합니다.

편집 : https://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspx

+0

와우. 아주 간단합니다. 나는 SignedXml 예제를 따랐다. 5 줄의 코드와 완료. 고맙습니다! – CAB

+0

** 공백이 중요 함을 지적하는 +1 ** 서명 유효성 검사. 'XmlReader'의 기본값은 공백을 없애기 위해서'XmlReaderSettings'에'IgnoreWhitespace = true'를 설정해야합니다. – Nick

0

active-directory-dotnet-webapp-wsfederation을 살펴보십시오.

기본적으로 SAM1 항목을 추출하고 OWIN Nuget Ws-Fed 패키지를 사용하십시오.

물론 IDP가 WS-FEd를 지원한다고 가정합니다.

+0

WS-Fed에서는 '아니오'입니다. 또한, 나에게 검증을위한 주장을 전달하는 인터페이스를 혼란스럽게하지 않으려 고 노력 중이다. – CAB