Freigeben über


Überschreiben der Identität eines Diensts zur Authentifizierung

In der Regel müssen Sie die Identität für einen Dienst nicht festlegen, da die Auswahl eines Clientanmeldeinformationstyps über den in den Dienstmetadaten angezeigten Identitätstyp entscheidet. Der folgende Konfigurationscode verwendet z. B. das <wsHttpBinding>-Element und legt das clientCredentialType-Attribut auf „Windows“ fest.

Das folgende Web Services Description Language (WSDL)-Fragment zeigt die Identität für den zuvor definierten Endpunkt an. In diesem Beispiel wird der Dienst als selbst gehosteter Dienst unter einem bestimmten Benutzerkonto (username@contoso.com) ausgeführt. Daher enthält die UPN-Identität (User Principal Name, Benutzerprinzipalname) den Kontonamen. Der UPN wird in einer Windows-Domäne auch als Benutzeranmeldename bezeichnet.

Eine Beispielanwendung zur Veranschaulichung der Identitätseinstellung finden Sie im Beispiel für die Dienstidentität. Weitere Informationen zur Dienstidentität finden Sie unter Dienstidentität und Authentifizierung.

Kerberos-Authentifizierung und Identität

Wenn ein Dienst für die Verwendung von Windows-Anmeldeinformationen konfiguriert ist, wird in der WSDL standardmäßig ein <identity>-Element generiert, das ein <userPrincipalName>-Element oder ein <servicePrincipalName>-Element enthält. Wenn der Dienst unter dem LocalSystem-Konto, dem LocalService-Konto oder dem NetworkService-Konto ausgeführt wird, wird standardmäßig ein Dienstprinzipalname (Service Principal Name, SPN) im Format host/<hostname> generiert, da diese Konten Zugriff auf die SPN-Daten des Computers haben. Wird der Dienst unter einem anderen Konto ausgeführt, generiert Windows Communication Foundation (WCF) einen UPN im Format <Benutzername>@<Domänenname>. Die Kerberos-Authentifizierung erfordert nämlich, dass für den Client ein UPN oder SPN zum Authentifizieren des Dienstes bereitgestellt wird.

Sie können auch das Tool Setspn zur Registrierung eines zusätzlichen SPN beim Konto eines Diensts in einer Domäne verwenden. Sie können dann den SPN als die Identität des Dienstes verwenden. Informationen zu diesem Tool finden Sie unter Übersicht über Setspn.

Hinweis

Zur Verwendung des Windows-Anmeldeinformationstyps ohne Aushandlung muss das Benutzerkonto des Dienstes Zugriff auf den bei der Active Directory-Domäne registrierten SPN haben. Dazu stehen Ihnen folgende Möglichkeiten zur Verfügung:

  • Verwenden Sie das NetworkService- oder das LocalSystem-Konto, um den Dienst auszuführen. Da diese Konten Zugriff auf den beim Hinzufügen des Computers zur Active Directory-Domäne erstellten Computer-SPN haben, generiert WCF automatisch das zutreffende SPN-Element am Endpunkt des Diensts in den Dienstmetadaten (WSDL).

  • Verwenden Sie ein beliebiges Active Directory-Domänenkonto, um den Dienst auszuführen. Erstellen Sie in diesem Fall mit dem Tool Setspn.exe einen SPN für dieses Domänenkonto. Konfigurieren Sie nach dem Erstellen des SPN für das Konto des Diensts WCF so, dass dieser SPN für die Clients des Diensts über seine Metadaten (WSDL) veröffentlicht wird. Legen Sie dazu die Endpunktidentität für den angezeigten Endpunkt entweder mit einer Anwendungskonfigurationsdatei oder mit Code fest.

Weitere Informationen zu SPNs, zum Kerberos-Protokoll und zu Active Directory finden Sie unter Technische Kerberos-Ergänzung für Windows.

Wenn SPN oder UPN der leeren Zeichenfolge entspricht

Das Festlegen von SPN oder UPN gleich einer leeren Zeichenfolge führt abhängig von der Sicherheitsebene und dem verwendeten Authentifizierungsmodus zu verschiedenen Ergebnissen:

  • Wenn Sie Sicherheit auf Transportebene verwenden, wird die NT LanMan (NTLM)-Authentifizierung ausgewählt.

  • Wenn Sie Sicherheit auf Nachrichtenebene verwenden, schlägt die Authentifizierung abhängig vom Authentifizierungsmodus möglicherweise fehl:

  • Wenn Sie den spnego-Modus verwenden und das AllowNtlm-Attribut auf false festgelegt ist, führt die Authentifizierung zu einem Fehler.

  • Sofern Sie den spnego-Modus verwenden und das AllowNtlm-Attribut auf true festgelegt ist, führt die Authentifizierung zu einem Fehler, wenn der UPN leer ist. Sie ist jedoch erfolgreich, wenn der SPN leer ist.

  • Wenn Sie Kerberos direkt (wird auch als "One-Shot" bezeichnet) verwenden, schlägt die Authentifizierung fehl.

Verwenden des <identity>-Elements bei der Konfiguration

Wenn Sie den Clientanmeldeinformationstyp in der zuvor gezeigten Bindung in Certificate ändern, enthält die generierte WSDL ein serialisiertes Base64-X.509-Zertifikat als Identitätswert, wie im folgenden Code gezeigt. Dies ist der Standard für alle Clientanmeldeinformationstypen außer Windows.

Sie können den Wert der Standarddienstidentität oder den Typ der Identität mit dem <identity>-Element bei der Konfiguration oder durch Festlegen der Identität im Code ändern. Der folgende Konfigurationscode legt eine DNS-Identität (Domain Name System) mit dem Wert contoso.com fest.

Programmgesteuertes Festlegen der Identität

Der Dienst muss nicht explizit eine Identität angeben, da sie von WCF automatisch ermittelt wird. Allerdings können Sie mit WCF bei Bedarf eine Identität für einen Endpunkt angeben. Mit dem folgenden Code wird ein neuer Dienstendpunkt mit einer bestimmten DNS-Identität hinzugefügt.

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

Weitere Informationen