2009-10-13 11 views
12

Chcę sprawdzić certyfikaty klienta w mojej usłudze WCF.Niestandardowa walidacja certyfikatu w usłudze WCF

Moim celem jest umożliwienie komunikowania się z moją usługą tylko klientom posiadającym certyfikaty z określonymi odciskami kciuków.

Moja usługa WCF jest hostowana w IIS, używam basicHttpBinding i security mode = "transport" z typem poświadczenia "Certificate". Usługi IIS wymagają certyfikatów klienta do komunikacji z usługą.

Z góry dziękuję za pomoc.

UPDATE: Moja konfiguracja:

<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> 

Zachowanie:

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

konfiguracji usługi:

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

I dla celów testu I wdrożone walidator w następujący sposób:

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"); 
     } 
    } 

A to nie działa. Mogę połączyć się z moją usługą za pomocą dowolnego ważnego certyfikatu.

Odpowiedz

14

Można utworzyć klasę pochodną X509CertificateValidator i użyć jej do wykonania niestandardowego sprawdzania poprawności przychodzącego certyfikatu. Wyrzuć wyjątek SecurityTokenValidationException, jeśli z jakiegoś powodu nie powiedzie się sprawdzanie poprawności.

Ustaw opcję CertificateValidationMode na wartość Niestandardowa i podaj swój weryfikator w sekcji zachowania usługi clientCertificate pliku konfiguracyjnego.

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

+2

Próbowałem dodać niestandardowy weryfikator do certyfikatu clientCertificate, ale nie działa. Wygląda na to, że jest przeznaczony do sprawdzania certyfikatu klienta, którego usługa będzie używać w trybie dupleksu. Muszę zweryfikować certyfikat przychodzący (certyfikat wysyłany przez klienta). Czy próbowałeś tej opcji w tym scenariuszu? – empi

+1

Może to działać po stronie klienta lub usługi i służy do sprawdzania certyfikatu wiadomości przychodzących. – Maurice

+0

Upewnij się, że dodajesz to do w celu sprawdzenia poprawności klienta w usłudze, która jest tym, czego potrzebujesz. Element jest używany tylko na kliencie w celu sprawdzenia poprawności usługi. – Maurice

7

nie sądzę, jest w każdym razie mieć „niestandardowa sprawdzania certyfikatu” z „” Bezpieczeństwa Transportu. Działa tylko z "Message Security".

+0

Nieprawda. Posiadam niestandardową walidację certyfikatów działającą w trybie transportowym – Jeremy

1

TAK, możesz użyć basicHttpBinding z zestawem bezpieczeństwa do Transport i musisz podłączyć się do kreacji ServiceHost w IIS - patrz Custom Service Host. Powinieneś być w stanie zweryfikować wartości odcisku palca, certyfikaty lub inne dane, jeśli utworzysz niestandardową sekcję konfiguracji, aby zdefiniować listę kryteriów sprawdzania poprawności.

Przykładowy kod do wdrożenia wszystkich powyższych jest dostępny w kodzie pobranym z this CodeProject artticle.

Powiązane problemy