Freigeben über


Nachrichtensicherheit mit einem Windows-Client ohne Anmeldeinformationen-Aushandlung

Das folgende Szenario zeigt einen durch das Kerberos-Protokoll gesicherten Windows Communication Foundation (WCF)-Client und -Dienst.

Sowohl der Dienst als auch der Client befinden sich in der gleichen Domäne bzw. in den gleichen vertrauenswürdigen Domänen.

Tipp

Der Unterschied zwischen diesem Szenario und Nachrichtensicherheit über einen Windows-Client besteht darin, dass in diesem Szenario vor dem Senden der Anwendungsnachricht keine Aushandlung der Dienstanmeldeinformationen mit dem Dienst stattfindet. Da hierzu das Kerberos-Protokoll erforderlich ist, muss für dieses Szenario auch eine Windows-Domänenumgebung vorhanden sein.

Nachrichtensicherheit ohne Anmeldeinformationen-Aushandlung

Merkmal Beschreibung

Sicherheitsmodus

Nachricht

Interoperabilität

Ja, WS-Security mit Clients mit Kerberos-Tokenprofilkompatibilität

Authentifizierung (Server)

Gegenseitige Authentifizierung des Servers und des Clients

Authentifizierung (Client)

Gegenseitige Authentifizierung des Servers und des Clients

Integrität

Ja

Vertraulichkeit

Ja

Transport

HTTP

Bindung

WSHttpBinding

Dienst

Der folgende Code und die folgende Konfiguration werden unabhängig voneinander ausgeführt. Führen Sie einen der folgenden Schritte aus:

  • Erstellen Sie einen separaten Dienst, indem Sie den Code ohne Konfiguration verwenden.
  • Erstellen Sie mit der angegebenen Konfiguration einen Dienst, aber definieren Sie keine Endpunkte.

Code

Der folgende Code dient zum Erstellen eines Dienstendpunkts mit Nachrichtensicherheit. Mit diesem Code wird das Aushandeln der Dienstanmeldeinformationen sowie das Einrichten eines Sicherheitskontexttokens (Security Context Token, SCT) deaktiviert.

Tipp

Zur Verwendung des Windows-Anmeldeinformationstyps ohne Aushandlung muss das Benutzerkonto des Diensts Zugriff auf den bei der Active Directory-Domäne registrierten Dienstprinzipalnamen (Service Principal Name, SPN) haben. Dazu gibt es zwei Möglichkeiten:

  1. Verwenden Sie das NetworkService-Konto oder das LocalSystem-Konto, um den Dienst auszuführen. Da diese Konten über Zugriff auf den beim Hinzufügen des Computers zur Active Directory-Domäne erstellten Computer-SPN verfügen, wird von WCF automatisch das entsprechende SPN-Element im Endpunkt des Diensts in den Dienstmetadaten (Web Services Description Language, WSDL) generiert.
  2. Verwenden Sie ein beliebiges Active Directory-Domänenkonto, um den Dienst auszuführen. In diesem Fall muss für das Domänenkonto ein SPN eingerichtet werden. Eine mögliche Vorgehensweise hierzu besteht in der Verwendung des Tools Setspn.exe. Konfigurieren Sie WCF nach dem Erstellen des SPNs für das Konto so, dass dieser SPN für die Clients des Diensts über seine Metadaten (WSDL) veröffentlicht wird. Legen Sie hierzu die Endpunktidentität für den angezeigten Endpunkt entweder mit einer Anwendungskonfigurationsdatei oder mit Code fest. Im folgenden Beispiel wird die Identität programmgesteuert veröffentlicht:

Weitere Informationen zu SPNs, zum Kerberos-Protokoll sowie zu Active Directory finden Sie unter Technische Kerberos-Ergänzung für Windows (möglicherweise in englischer Sprache). Weitere Informationen zu Endpunktidentitäten finden Sie unter SecurityBindingElement-Authentifizierungsmodi.

Konfiguration

Anstelle des Codes kann die folgende Konfiguration verwendet werden:

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

Der folgende Code und die folgende Konfiguration werden unabhängig voneinander ausgeführt. Führen Sie einen der folgenden Schritte aus:

  • Erstellen Sie mit dem Code (und Clientcode) einen eigenständigen Client.
  • Erstellen Sie einen Client, der keine Endpunktadressen definiert. Verwenden Sie stattdessen den Clientkonstruktor, der den Konfigurationsnamen als Argument verwendet. Beispiel:

Code

Der folgende Code dient zum Konfigurieren des Clients. Der Sicherheitsmodus ist auf Nachrichtensicherheit, der Typ der Clientanmeldeinformationen auf Windows festgelegt. Die Eigenschaften NegotiateServiceCredential und EstablishSecurityContext sind auf false festgelegt.

Tipp

Zur Verwendung des Windows-Anmeldeinformationstyps ohne Aushandlung muss der Client vor dem Starten der Kommunikation mit dem Dienst mit dem Konto-SPN des Diensts konfiguriert werden. Der SPN wird vom Client zum Abrufen des Kerberos-Tokens verwendet, um damit die Kommunikation mit dem Dienst zu authentifizieren und zu sichern. Im folgenden Beispiel wird das Konfigurieren des Clients mit dem SPN des Diensts veranschaulicht. Wird ServiceModel Metadata Utility Tool (Svcutil.exe) zum Generieren des Clients verwendet, wird der SPN des Diensts aus den Dienstmetadaten (WSDL) automatisch an den Client weitergegeben, sofern diese Information in den Metadaten des Diensts enthalten ist. Weitere Informationen zum Konfigurieren des Diensts, sodass der SPN in die Dienstmetadaten aufgenommen wird, finden Sie weiter unten in diesem Thema im Abschnitt "Dienst".

Weitere Informationen zu SPNs, Kerberos und Active Directory finden Sie unter https://go.microsoft.com/fwlink/?LinkId=88330 (möglicherweise in englischer Sprache). Weitere Informationen zu Endpunktidentitäten finden Sie im Thema SecurityBindingElement-Authentifizierungsmodi.

Konfiguration

Der folgende Code konfiguriert den Client. Das <ServicePrincipalName>-Element muss so festgelegt werden, dass es dem für das Dienstkonto in der Active Directory-Domäne registrierten Dienst-SPN entspricht.

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

Siehe auch

Konzepte

Sicherheitsübersicht
Dienstidentität und Authentifizierung