2009-10-13 13 views
12

Deseo verificar certificados de cliente en mi servicio WCF.Validación de certificado personalizado en el servicio WCF

Mi objetivo es permitir que solo los clientes con certificados con huellas digitales específicas puedan comunicarse con mi servicio.

Mi servicio WCF está alojado en IIS, estoy usando basicHttpBinding y security mode = "transport" con credencial tipo "Certificate". IIS requiere certificados de cliente para la comunicación con el servicio.

Gracias de antemano por ayuda.

ACTUALIZACIÓN: Mi configuración:

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

Comportamiento:

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

configuración del servicio:

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

Y para fines de prueba he implementado validador de esta manera:

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

Y esto no funciona. Puedo conectarme a mi servicio con cualquier certificado válido.

Respuesta

14

Puede crear una clase derivada de X509CertificateValidator y usarla para realizar una validación personalizada del certificado entrante. Lanza una SecurityTokenValidationException si quieres suspender la validación por algún motivo.

Establezca certificateValidationMode en Custom y especifique su validador en la sección de comportamiento del servicio clientCertificate del archivo de configuración.

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

+2

Intenté agregar un validador personalizado en clientCertificate pero no funciona. Parece que está diseñado para validar el certificado del cliente que el servicio usará en modo dúplex. Necesito validar el certificado entrante (certificado que el cliente está enviando). ¿Has probado esta opción en este escenario? – empi

+1

Esto puede funcionar en el lado del cliente o del servicio y se usa para validar el certificado de mensaje entrante. – Maurice

+0

Asegúrese de agregar esto a para validar el cliente en el servicio que es lo que desea. El se usa solo en el cliente para validar el servicio. – Maurice

7

No creo que hay de todos modos tener 'Custom validación de certificados' con 'Transporte de Seguridad'. Solo funciona con 'Message Security'.

+0

No es cierto. Tengo una validación de certificado personalizada ejecutándose en modo de transporte – Jeremy

1

SÍ, puede utilizar basicHttpBinding con la configuración de seguridad en Transport y debe enlazar a la creación de ServiceHost en IIS - consulte Custom Service Host. Debería poder validar los valores de huella digital, certificados u otros datos si crea una sección de configuración personalizada para definir una lista de criterios de validación.

Código de ejemplo para la implementación de todo lo anterior está disponible en el código de descarga desde this CodeProject artticle.

Cuestiones relacionadas