Condividi tramite


Protezione dei messaggi con un client Windows senza negoziazione delle credenziali

Nello scenario seguente vengono mostrati un client e un servizio Windows Communication Foundation (WCF) protetti dal protocollo Kerberos.

Il servizio e il client sono nello stesso dominio o sono entrambi in domini attendibili.

Nota

La differenza tra questo scenario e quello illustrato nella sezione Protezione dei messaggi con un client Windows è che questo scenario non negozia la credenziale del servizio con il servizio prima di inviare il messaggio dell'applicazione. Inoltre, poiché ciò richiede il protocollo Kerberos, questo scenario richiede un dominio Windows.

Sicurezza dei messaggi senza negoziazione delle credenziali

Caratteristica Descrizione

Modalità di protezione

Messaggio

Interoperabilità

Sì, WS-Security con client compatibili con il profilo del token Kerberos

Autenticazione (server)

Autenticazione reciproca del server e del client

Autenticazione (client)

Autenticazione reciproca del server e del client

Integrità

Riservatezza

Trasporto

HTTP

Associazione

WSHttpBinding

Servizio

Il codice e la configurazione seguenti devono essere eseguiti in modo indipendente. Eseguire una delle operazioni seguenti:

  • Creare un servizio autonomo utilizzando il codice senza alcuna configurazione.
  • Creare un servizio utilizzando la configurazione fornita, ma non definire alcun endpoint.

Codice

Il codice seguente crea un endpoint del servizio che utilizza la protezione del messaggio. Il codice disattiva la negoziazione della credenziale del servizio e la definizione di un token del contesto di protezione (SCT, Security Context Token).

Nota

Per utilizzare il tipo di credenziale di Windows senza negoziazione, l'account utente del servizio deve avere accesso al nome dell'entità servizio (SPN, Service Principal Name) registrato con il dominio di Active Directory. Questa operazione può essere eseguita in due modi diversi:

  1. Utilizzare l'account NetworkService o LocalSystem per eseguire il servizio. Poiché questi account hanno accesso al nome dell'entità servizio (SPN) del computer che viene definito quando il computer viene associato al dominio di Active Directory, WCF genera automaticamente l'elemento SPN corretto all'interno dell'endpoint del servizio nei metadati (WSDL) del servizio.
  2. Utilizzare un account di dominio Active Directory arbitrario per eseguire il servizio. In questo caso è necessario definire un SPN per questo account di dominio. A tale scopo è possibile utilizzare l'utilità Setspn.exe. Dopo aver creato il nome dell'entità servizio per l'account del servizio, configurare WCF per la pubblicazione del nome dell'entità servizio nei client del servizio tramite i relativi metadati (WSDL). Questa operazione viene eseguita impostando l'identità per l'endpoint esposto o tramite un file di configurazione dell'applicazione o tramite codice. Nell'esempio seguente l'identità viene pubblicata a livello di programmazione.

Per ulteriori informazioni sui nomi di entità servizio (SPN), sul protocollo Kerberos e su Active Directory, vedere il supplemento tecnico Kerberos per Windows. Per ulteriori informazioni sulle identità endpoint, vedere Modalità di autenticazione di SecurityBindingElement.

Configurazione

Invece del codice, è possibile utilizzare la configurazione seguente:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors />
    <services>
      <service behaviorConfiguration="" name="ServiceModel.Calculator">
        <endpoint address="https://localhost/Calculator" 
                  binding="wsHttpBinding"
                  bindingConfiguration="KerberosBinding"
                  name="WSHttpBinding_ICalculator"
                  contract="ServiceModel.ICalculator" 
                  listenUri="net.tcp://localhost/metadata" >
         <identity>
            <servicePrincipalName value="service_spn_name" />
         </identity>
        </endpoint>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="KerberosBinding">
          <security>
            <message negotiateServiceCredential="false" 
                     establishSecurityContext="false" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client />
  </system.serviceModel>
</configuration>

Client

Il codice e la configurazione seguenti devono essere eseguiti in modo indipendente. Eseguire una delle operazioni seguenti:

  • Creare un client autonomo utilizzando il codice (e il codice client).
  • Creare un client che non definisce alcun indirizzo di endpoint. Utilizzare invece il costruttore client che accetta il nome della configurazione come argomento. Ad esempio:

Codice

Nel codice seguente viene configurato il client. La modalità di protezione è impostata su Messaggio e il tipo di credenziale client è impostato su Windows. Le proprietà NegotiateServiceCredential e EstablishSecurityContext sono impostate su false.

Nota

Per utilizzare un tipo di credenziale di Windows senza negoziazione, il client deve essere configurato con il nome di entità servizio dell'account del servizio prima di iniziare la comunicazione con il servizio. Il client utilizza il nome dell'entità servizio (SPN) per ottenere il token Kerberos per autenticare e proteggere la comunicazione con il servizio. L'esempio seguente mostra come configurare il client con l'SPN del servizio. Se si utilizza ServiceModel Metadata Utility Tool (Svcutil.exe) per generare il client, l'SPN del servizio verrà propagato automaticamente al client dai metadati (WSDL) del servizio, se i metadati del servizio contengono tali informazioni. Per ulteriori informazioni su come configurare il servizio per includere il relativo SPN nei metadati del servizio, vedere la sezione "Servizio" più avanti in questo argomento.

Per ulteriori informazioni sugli SPN, su Kerberos e su Active Directory, visitare il sito Web Microsoft all'indirizzo https://go.microsoft.com/fwlink/?LinkId=88330. Per ulteriori informazioni sulle identità degli endpoint, vedere Modalità di autenticazione di SecurityBindingElement.

Configurazione

Nel codice seguente viene configurato il client. Notare che l'elemento <ServicePrincipalName> deve essere impostato in modo da corrispondere all'SPN del servizio registrato per l'account del servizio nel dominio di Active Directory.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_ICalculator" >
          <security mode="Message">
            <message clientCredentialType="Windows" 
                     negotiateServiceCredential="false"
                     establishSecurityContext="false" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://localhost/Calculator" 
                binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_ICalculator"
                contract="ICalculator"
                name="WSHttpBinding_ICalculator">
        <identity>
          <servicePrincipalName value="service_spn_name" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

Vedere anche

Concetti

Cenni preliminari sulla protezione
Identità del servizio e autenticazione