2009-10-13 12 views
12

WCF hizmetimde istemci sertifikalarını kontrol etmek istiyorum.WCF hizmetinde özel sertifika doğrulaması

Amacım, yalnızca belirli bir parmak izine sahip sertifikaları olan istemcilerin hizmetimle iletişim kurabilmelerini sağlamaktır.

WCF hizmetim IIS'de barındırılıyor, basicHttpBinding ve security mode = "Aktarım" kimlik bilgisiyle "aktarım" kullanıyorum. IIS, hizmetle iletişim için istemci sertifikaları gerektirir.

Yardım için şimdiden teşekkür ederiz.

GÜNCELLEME: Benim yapılandırma:

<basicHttpBinding> 
<binding 
      name="testBinding" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas 
        maxDepth="2147483647" 
       maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 
<security mode="Transport"> 
       <transport clientCredentialType="Certificate"/> 
      </security> 

</binding> 
</basicHttpBinding> 

Davranış:

<serviceBehaviors> 
    <behavior name="SomeServiceBehavior"> 
     <serviceMetadata httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
     <clientCertificate> 
      <authentication certificateValidationMode="Custom" customCertificateValidatorType="SomeService.CustomCertificateValidator,SomeService" /> 
     </clientCertificate> 
     </serviceCredentials>   
    </behavior> 
    </serviceBehaviors> 

Hizmet yapılandırması:

<service 
       behaviorConfiguration="SomeServiceBehavior" 
       name="SomeService"> 
     <endpoint 
        address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="testBinding" 
        contract="ISomeService"> 
     </endpoint> 
     </service> 

Ve Kontrol amaçlı bu yolla doğrulayıcı uygulanan:

public class CustomCertificateValidator : X509CertificateValidator 
    { 
     public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) 
     {     
      throw new SecurityTokenValidationException("TEST Certificate was not issued by a trusted issuer TEST"); 
     } 
    } 

Ve bu işe yaramıyor. Hizmetime geçerli herhangi bir sertifika ile bağlanabilirim.

cevap

14

X509CertificateValidator'dan türetilmiş bir sınıf oluşturabilir ve gelen sertifikanın özel doğrulamasını yapmak için bunu kullanabilirsiniz. Herhangi bir nedenle doğrulama işleminden başarısız olmak istiyorsanız bir SecurityTokenValidationException atın.

certificateValidationMode'u Custom'a ayarlayın ve yapılandırma dosyasının clientCertificate hizmet davranışı bölümünde validator'unuzu belirtin. Sanmıyorum

How to: Create a Service that Employs a Custom Certificate Validator

+2

Ben ClientCertificate özel doğrulayıcı eklemek çalıştı ama çalışmıyor. Hizmetin çift yönlü modda kullanacağı istemci sertifikasını doğrulamak üzere tasarlanmış gibi görünüyor. Gelen sertifikayı doğrulamam gerekir (istemcinin gönderdiği sertifika). Bu senaryoda bu seçeneği denediniz mi? – empi

+1

Bu, istemci veya hizmet tarafında çalışabilir ve gelen ileti sertifikasını doğrulamak için kullanılır. İstediğini olduğu hizmette doğrulamak için müşteriye bu eklemek emin olun – Maurice

+0

. , yalnızca hizmeti doğrulamak için istemcide kullanılır. – Maurice

7

'Ulaştırma Güvenliği' ile 'Özel Belgesi Doğrulama' olması zaten yoktur. Sadece 'Message Security' ile çalışır.

+0

Doğru değil. Taşıma modunda çalışırken özel sertifika doğrulaması var – Jeremy

1

EVET, Aktarıcıya ayarlanmış güvenlik ile basicHttpBinding kullanabilir ve IIS içinde ServiceHost yaratılmasına kanca gerekir - Custom Service Host bakın. Doğrulama ölçütleri listesini tanımlamak için özel yapılandırma bölümü oluşturursanız, parmak izi değerlerini, sertifikaları veya diğer verileri doğrulamanız gerekir.

Yukarıdakilerin hepsinin uygulanması için örnek kod, this CodeProject artticle kodundan indirilebilir.