Protezione delle associazioni personalizzate

In questo esempio viene illustrato come configurare la protezione mediante un'associazione personalizzata. Viene mostrato come utilizzare un'associazione personalizzata per attivare la protezione a livello di messaggio insieme con un trasporto sicuro. Questo è utile quando è necessario un trasporto protetto per trasmettere i messaggi tra client e servizio e simultaneamente i messaggi devono essere protetti a livello di messaggio. Questa configurazione non è supportata dalle associazioni fornite dal sistema.

Questo esempio è costituito da un programma di console client (EXE) e un programma di console del servizio (EXE). Il servizio implementa un contratto duplex. Il contratto è definito dall'interfaccia ICalculatorDuplex, che espone operazioni matematiche (somma, sottrazione, moltiplicazione e divisione). L'interfaccia ICalculatorDuplex consente al client di eseguire operazioni matematiche, calcolando un risultato in una sessione. Il servizio potrebbe restituire risultati sull'interfaccia ICalculatorDuplexCallback indipendentemente. Poiché occorre definire un contesto per correlare l'insieme di messaggi scambiati fra il client e il servizio, i contratti duplex richiedono una sessione. Viene definita un'associazione personalizzata che supporta la comunicazione duplex ed è protetta.

Nota

La procedura di installazione e le istruzioni di generazione per questo esempio si trovano alla fine di questo argomento.

La configurazione del servizio definisce un'associazione personalizzata che supporta i seguenti elementi:

  • Comunicazione TCP protetta tramite il protocollo TLS/SSL
  • Protezione dei messaggi di Windows.

La configurazione dell'associazione personalizzata consente il trasporto protetto abilitando simultaneamente la protezione a livello di messaggio. L'ordinamento degli elementi di associazione è importante nella definizione di un'associazione personalizzata, perché ognuno di essi rappresenta un livello nello stack di canali (vedere Custom Bindings). L'associazione personalizzata viene definita nei file di configurazione del servizio e del client, come illustrato nell'esempio di configurazione seguente.

<bindings>
  <!-- Configure a custom binding. -->
  <customBinding>
    <binding name="Binding1">
      <security authenticationMode="SecureConversation"
                 requireSecurityContextCancellation="true">
      </security>
      <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
      <sslStreamSecurity requireClientCertificate="false"/>
      <tcpTransport/>
    </binding>
  </customBinding>
</bindings>

L'associazione personalizzata utilizza un certificato del servizio per autenticare il servizio sul livello del trasporto e proteggere i messaggi durante la trasmissione tra client e servizio. Questa operazione viene eseguita dall'elemento di associazione sslStreamSecurity. Il certificato del servizio viene configurato utilizzando un comportamento del servizio come illustrato nell'esempio di configurazione seguente.

<behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="False" />
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

L'associazione personalizzata utilizza inoltre la protezione dei messaggi con tipo di credenziale di Windows, che è il tipo di credenziale predefinito. Questa operazione viene eseguita dall'elemento di associazione security. Il client e il servizio vengono autenticati mediante la protezione a livello di messaggio se il meccanismo di autenticazione Kerberos è disponibile. Questa situazione si verifica se l'esempio viene eseguito nell'ambiente di Active Directory. Se il meccanismo di autenticazione Kerberos non è disponibile, viene utilizzata l'autenticazione NTLM. NTLM autentica il client con il servizio, ma non autentica il servizio con il client. L'elemento di associazione security viene configurato per utilizzare un authenticationType SecureConversation , che comporta la creazione di una sessione di protezione nel client e nel servizio. Questa operazione è necessaria per consentire il funzionamento del contratto duplex del servizio.

Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. Premere INVIO nella finestra del client per arrestare il client.

Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)

Quando si esegue l'esempio, vengono visualizzati i messaggi restituiti al client sull'interfaccia di callback inviata dal servizio. Una volta completate tutte le operazioni, vengono visualizzati tutti i risultati intermedi, seguiti dall'intera equazione. Premere INVIO per arrestare il client.

Il file batch Setup.bat incluso consente di configurare il client e il server con il certificato del servizio attinente per eseguire un'applicazione ospitata che richiede protezione basata su certificato. Questo file batch deve essere modificato per funzionare tra più computer o in caso di applicazioni indipendenti.

Di seguito viene fornita una breve panoramica delle varie sezioni dei file batch che si applicano a questo esempio, in modo che possano essere modificati per l'esecuzione nella configurazione appropriata:

  • Creazione del certificato server.
    Le righe seguenti del file Setup.bat creano il certificato server da utilizzare. La variabile %SERVER_NAME% specifica il nome del server. Modificare questa variabile per specificare il nome del server. Questo file batch imposta localhost come valore predefinito del nome del server.
    Il certificato viene archiviato in CurrentUser per i servizi ospitati su Web.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • Installazione del certificato server nell'archivio certificati attendibili del client.
    Le righe seguenti nel file Setup.bat copiano il certificato server nell'archivio Persone attendibili del client. Questo passaggio è necessario perché certificati generati da Makecert.exe non sono considerati implicitamente attendibili dal sistema client. Se è già disponibile un certificato che è impostato come radice in un certificato radice client attendibile, ad esempio un certificato rilasciato da Microsoft, il passaggio della popolazione dell'archivio certificati client con il certificato server non è necessario.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

    Nota

    Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di SDK di Windows. Richiede che la variabile di ambiente MSSDK punti alla directory in cui è installato SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi di SDK di Windows.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di avere eseguito Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per generare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

  3. Per eseguire l'esempio su una configurazione con un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.

Per eseguire l'esempio sullo stesso computer

  1. Assicurarsi che il percorso includa la cartella in cui è situato Makecert.exe.

  2. Eseguire Setup.bat dalla cartella di installazione dell'esempio. In questo modo vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.

    Nota

    Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di SDK di Windows. Richiede che la variabile di ambiente MSSDK punti alla directory in cui è installato SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi di SDK di Windows.

  3. Avviare Service.exe da \service\bin.

  4. Avviare Client.exe da \client\bin. L'attività del client viene visualizzata nella finestra dell'applicazione console.

  5. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi.

Per eseguire l'esempio tra più computer

  1. Sul computer del servizio:

    1. Creare una directory virtuale sul computer del servizio denominata servicemodelsamples.

    2. Copiare i file del programma del servizio da \inetpub\wwwroot\servicemodelsamples alla directory virtuale sul computer del servizio. Assicurarsi di copiare i file nella sottodirectory \bin.

    3. Copiare i file Setup.bat e Cleanup.bat nel computer del servizio.

    4. Eseguire il seguente comando: Setup.bat service. In questo modo viene creato il certificato del servizio con il nome dell'oggetto che corrisponde al nome del computer del computer sul quale viene eseguito il file batch.

      Nota

      Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di SDK di Windows. Richiede che la variabile di ambiente MSSDK punti alla directory in cui è installato SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi di SDK di Windows.

    5. Modificare il serviceCertificate element of serviceCredentials nel file Service.exe.config per riflettere il nome dell'oggetto del certificato generato nel passaggio precedente.

    6. Eseguire Service.exe da un prompt dei comandi.

  2. Sul computer client:

    1. Copiare i file del programma client dalla cartella \client\bin\ al computer client. Copiare inoltre il file Cleanup.bat.

    2. Eseguire Cleanup.bat per rimuovere i certificati obsoleti dagli esempi precedenti.

    3. Esportare il certificato del servizio eseguendo il comando seguente sul computer del servizio (sostituire %SERVER_NAME% con il nome completo del computer in cui viene eseguito il servizio):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
      
    4. Copiare %NOME_SERVER%.cer sul computer client (sostituire %NOME_SERVER% con il nome completo del computer in cui viene eseguito il servizio).

    5. Importare il certificato del servizio eseguendo il comando seguente sul computer client (sostituire %NOME_SERVER% con il nome completo del computer in cui viene eseguito il servizio):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
      

      I passaggi c, d ed e non sono necessari se il certificato viene emesso da un'emittente attendibile.

    6. Modificare il file App.config del client come segue:

      <client>
          <endpoint name="default"
              address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service" 
              binding="customBinding" 
              bindingConfiguration="Binding1" 
              contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex"
      behaviorConfiguration="CalculatorClientBehavior" />
      </client>
      
    7. Se il servizio viene eseguito in un account diverso da NetworkService o LocalSystem in un ambiente del dominio, potrebbe essere necessario modificare l'identità dell'endpoint per l'endpoint del servizio nel file App.config del client per impostare l'UPN o il SPN appropriato basato sull'account utilizzato per eseguire il servizio. Per ulteriori informazioni sull'identità dell'endpoint, vedere Specifying Service Identity.

    8. Eseguire Client.exe da un prompt dei comandi.

Per eseguire la pulitura dopo l'esempio

  • Eseguire Cleanup.bat nella cartella degli esempi una volta completato l'esempio.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.