Condividi tramite


Procedura: specificare valori di credenziali client

Tramite Windows Communication Foundation (WCF), il servizio può specificare il modo in cui un client viene autenticato nel servizio. Ad esempio, un servizio può stabilire che il client venga autenticato con un certificato.

Per determinare il tipo di credenziale client

  1. Recuperare i metadati dall'endpoint dei metadati di servizio. I metadati sono in genere costituiti da due file: il codice client del linguaggio di programmazione selezionato (l'impostazione predefinita è Visual C#) e un file di configurazione XML. Un modo per recuperare i metadati consiste nell'utilizzare lo strumento Svcutil.exe per restituire il codice e la configurazione client. Per ulteriori informazioni, vedere Recupero dei metadati e Strumento ServiceModel Metadata Utility Tool (Svcutil.exe).

  2. Aprire il file di configurazione XML. Se si utilizza lo strumento Svcutil.exe, il nome predefinito del file è Output.config.

  3. Trovare l'elemento <security> con l'attributo mode (<security mode = MessageOrTransport> in cui MessageOrTransport è impostato su una delle modalità di sicurezza.

  4. Trovare l'elemento figlio che corrisponda al valore della modalità. Ad esempio, se la modalità è impostata su Message, trovare l'elemento <message> contenuto nell'elemento <security>.

  5. Notare il valore assegnato all'attributo clientCredentialType. Il valore effettivo dipende dalla modalità utilizzata, trasporto o messaggio.

Nel codice XML seguente viene mostrata la configurazione di un client per cui viene utilizzata la sicurezza dei messaggi e viene richiesto un certificato per autenticare il client.

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
     <message clientCredentialType="Certificate" negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
</security>

Esempio: Modalità di trasporto TCP con certificato come credenziale client

In questo esempio la modalità di sicurezza viene impostata sulla modalità Trasporto e il valore delle credenziali client su un certificato X.509. Nelle procedure seguenti viene descritto come impostare il valore delle credenziali client sul client nel codice e nella configurazione. Si presuppone che sia stato utilizzato lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) per ottenere i metadati (codice e configurazione) dal servizio. Per altre informazioni, vedere Procedura: Creare un client.

Per specificare il valore delle credenziali client nel client nel codice

  1. Utilizzare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) per generare il codice e la configurazione dal servizio.

  2. Creare un'istanza del client WCF usando il codice generato.

  3. Nella classe del client impostare la proprietà ClientCredentials della classe ClientBase<TChannel> su un valore appropriato. In questo esempio la proprietà viene impostata su un certificato X.509 utilizzando il metodo SetCertificate della classe X509CertificateInitiatorClientCredential.

    // Create a binding using Transport and a certificate.
    NetTcpBinding b = new NetTcpBinding();
    b.Security.Mode = SecurityMode.Transport;
    b.Security.Transport.ClientCredentialType =
        TcpClientCredentialType.Certificate;
    
    // Create an EndPointAddress.
    EndpointAddress ea = new EndpointAddress(
        "net.tcp://localHost:8036/Calculator/MyCalculator");
    
    // Create the client.
    CalculatorClient cc = new CalculatorClient(b, ea);
    
    // Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate(
        StoreLocation.LocalMachine,
        StoreName.My,
        X509FindType.FindBySubjectName,
        "cohowinery.com");
    try
    {
        cc.Open();
        // Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2));
        cc.Close();
    }
    catch (AddressAccessDeniedException adExc)
    {
        Console.WriteLine(adExc.Message);
        Console.ReadLine();
    }
    catch (System.Exception exc)
    {
        Console.WriteLine(exc.Message);
        Console.ReadLine();
    }
    
    ' Create a binding using Transport and a certificate.
    Dim b As New NetTcpBinding()
    b.Security.Mode = SecurityMode.Transport
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
    
    ' Create an EndPointAddress.
    Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator")
    
    ' Create the client.
    Dim cc As New CalculatorClient(b, ea)
    
    ' Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com")
    Try
        cc.Open()
        ' Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2))
        cc.Close()
    Catch adExc As AddressAccessDeniedException
        Console.WriteLine(adExc.Message)
        Console.ReadLine()
    Catch exc As System.Exception
        Console.WriteLine(exc.Message)
        Console.ReadLine()
    End Try
    

    È possibile utilizzare qualsiasi enumerazione della classe X509FindType. Il nome del soggetto viene qui utilizzato nel caso in cui il certificato venga modificato (a causa di una data di scadenza). L'utilizzo del nome del soggetto consente all'infrastruttura di cercare nuovamente il certificato.

Per specificare il valore delle credenziali client nel client nella configurazione

  1. Aggiungere un elemento <behavior> all'elemento <behaviors>.

  2. Aggiungere un elemento <clientCredentials> all'elemento <behaviors>. Avere cura di impostare l'attributo name obbligatorio su un valore appropriato.

  3. Aggiungere un elemento <clientCertificate> all'elemento <clientCredentials>.

  4. Impostare gli attributi seguenti sui valori appropriati: storeLocation, storeName, x509FindType e findValue, come illustrato nel codice seguente. Per altre informazioni sui certificati, vedere Utilizzo dei certificati.

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. Quando si configura il client, specificare il comportamento impostando l'attributo behaviorConfiguration dell'elemento <endpoint>, come illustrato nel codice seguente. L'elemento endpoint è figlio dell'elemento <client>. Specificare inoltre il nome della configurazione dell'associazione impostando l'attributo bindingConfiguration sull'associazione per il client. Se si utilizza un file di configurazione generato, il nome dell'associazione viene generato automaticamente. In questo esempio il nome è "tcpBindingWithCredential".

    <client>
      <endpoint name =""
                address="net.tcp://contoso.com:8036/aloha"
                binding="netTcpBinding"
                bindingConfiguration="tcpBindingWithCredential"
                behaviorConfiguration="endpointCredentialBehavior" />
    </client>
    

Vedi anche