Procedura: creare un servizio che utilizza una convalida del certificato personalizzata

In questo argomento viene illustrato come implementare una convalida del certificato personalizzata e come configurare le credenziali del client o del servizio per sostituire la logica di convalida del certificato predefinita con la convalida del certificato personalizzata.

Se il certificato X.509 viene utilizzato per autenticare un client o un servizio, per impostazione predefinita Windows Communication Foundation (WCF) utilizza l'archivio certificati di Windows e l'API di crittografia per convalidare il certificato e verificare che sia attendibile. A volte la funzionalità di convalida del certificato incorporata non è sufficiente e deve essere modificata. WCF fornisce un modo semplice per modificare la logica di convalida consentendo agli utenti di aggiungere una convalida del certificato personalizzata. Se si specifica una convalida del certificato personalizzata, WCF non utilizza la logica di convalida del certificato incorporata, bensì si basa sulla convalida personalizzata.

Procedure

Per creare una convalida del certificato personalizzata

  1. Definire una nuova classe derivata da X509CertificateValidator.

  2. Implementare il metodo astratto Validate. Il certificato che deve essere convalidato viene passato come argomento al metodo. Se il certificato passato non è valido in base alla logica di convalida, questo metodo genera un'eccezione SecurityTokenValidationException. Se il certificato è valido, il metodo viene restituito al chiamante.

    Nota

    Affinché gli errori di autenticazione vengano restituiti al client, generare una classe FaultException nel metodo Validate.

Per specificare una convalida del certificato personalizzata nella configurazione del servizio

  1. Aggiungere un elemento <behaviors> e una serviceBehaviors section all'elemento <system.ServiceModel>.

  2. Aggiungere un Behavior element e impostare l'attributo name su un valore appropriato.

  3. Aggiungere un <serviceCredentials> Element all'elemento <behavior>.

  4. Aggiungere un elemento <clientCertificate> all'elemento <serviceCredentials>.

  5. Aggiungere un <authentication> of <clientCertificate> Element all'elemento <clientCertificate>.

  6. Impostare l'attributo customCertificateValidatorType sul tipo di convalida. Nell'esempio seguente viene impostato l'attributo sullo spazio dei nomi e sul nome del tipo.

  7. Impostare l'attributo certificateValidationMode su Custom.

    <configuration>
     <system.serviceModel>
      <behaviors>
       <serviceBehaviors>
        <behavior name="ServiceBehavior">
         <serviceCredentials>
          <clientCertificate>
          <authentication certificateValidationMode="Custom" customCertificateValidatorType="Samples.MyValidator, service" />
          </clientCertificate>
         </serviceCredentials>
        </behavior>
       </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    </configuration>
    

Per specificare una convalida del certificato personalizzata mediante configurazione sul client

  1. Aggiungere un elemento <behaviors> e una serviceBehaviors section all'elemento <system.ServiceModel>.

  2. Aggiungere un elemento <endpointBehaviors>.

  3. Aggiungere un elemento <behavior> e impostare l'attributo name su un valore appropriato.

  4. Aggiungere un elemento <clientCredentials>.

  5. Aggiungere un <serviceCertificate> of <clientCredentials> Element.

  6. Aggiungere un <authentication> of <serviceCertificate> Element come illustrato nell'esempio seguente.

  7. Impostare l'attributo customCertificateValidatorType sul tipo di convalida.

  8. Impostare l'attributo certificateValidationMode su Custom. Nell'esempio seguente viene impostato l'attributo sullo spazio dei nomi e sul nome del tipo.

    <configuration>
     <system.serviceModel>
      <behaviors>
       <endpointBehaviors>
        <behavior name="clientBehavior">
         <clientCredentials>
          <serviceCertificate>
           <authentication certificateValidationMode="Custom" 
                  customCertificateValidatorType=
             "Samples.CustomX509CertificateValidator, client"/>
          </serviceCertificate>
         </clientCredentials>
        </behavior>
       </endpointBehaviors>
      </behaviors>
     </system.serviceModel>
    </configuration>
    

Per specificare una convalida del certificato personalizzata mediante il codice sul servizio

  1. Specificare la convalida del certificato personalizzata sulla proprietà ClientCertificate. È possibile accedere alle credenziali del servizio mediante la proprietà Credentials.

  2. Impostare la proprietà CertificateValidationMode su Custom.

Per specificare una convalida del certificato personalizzata mediante il codice sul client

  1. Specificare la convalida del certificato personalizzata mediante la proprietà CustomCertificateValidator. È possibile accedere alle credenziali del client mediante la proprietà Credentials. (La classe client generata da ServiceModel Metadata Utility Tool (Svcutil.exe) deriva sempre dalla classe ClientBase.)

  2. Impostare la proprietà CertificateValidationMode su Custom.

Esempio

Descrizione

Nell'esempio seguente viene illustrata un'implementazione di una convalida del certificato personalizzata e l'utilizzo sul servizio.

Codice

Vedere anche

Riferimenti

X509CertificateValidator