Überschreiben der Identität eines Dienstes zur AuthentifizierungOverriding the Identity of a Service for Authentication

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.Typically, you do not have to set the identity on a service because the selection of a client credential type dictates the type of identity exposed in the service metadata. Der folgende Konfigurationscode verwendet beispielsweise die <WsHttpBinding > Element und legt die clientCredentialType -Attribut auf Windows.For example, the following configuration code uses the <wsHttpBinding> element and sets the clientCredentialType attribute to Windows.

Das folgende Web Services Description Language (WSDL)-Fragment zeigt die Identität für den zuvor definierten Endpunkt an.The following Web Services Description Language (WSDL) fragment shows the identity for the endpoint previously defined. In diesem Beispiel wird der Dienst ausgeführt wird, als ein selbst gehosteter Dienst unter einem bestimmten Benutzerkonto (username@contoso.com) und aus diesem Grund enthält die Identität des Benutzers Benutzerprinzipalnamen (UPN) des Kontonamens.In this example, the service is running as a self-hosted service under a particular user account (username@contoso.com) and therefore the user principal name (UPN) identity contains the account name. Der UPN wird in einer Windows-Domäne auch als Benutzeranmeldename bezeichnet.The UPN is also known as the user logon name in a Windows domain.

Eine beispielanwendung, die identitätseinstellung veranschaulicht, finden Sie unter Dienstidentitätsbeispiel.For a sample application that demonstrates identity setting, see Service Identity Sample. Weitere Informationen zur Dienstidentität, finden Sie unter -Dienstidentität und Authentifizierung.For more information about service identity, see Service Identity and Authentication.

Kerberos-Authentifizierung und IdentitätKerberos Authentication and Identity

In der Standardeinstellung, wenn ein Dienst so konfiguriert ist, ein Windows-Anmeldeinformationen verwendet ein <Identität > -Element, enthält eine <"userPrincipalName" > oder <ServicePrincipalName > Element in die WSDL-Datei generiert wird.By default, when a service is configured to use a Windows credential, an <identity> element that contains a <userPrincipalName> or <servicePrincipalName> element is generated in the WSDL. Wenn der Dienst, unter ausgeführt wird der LocalSystem, LocalService, oder NetworkService Konto, einen Dienst mit dem Dienstprinzipalnamen (SPN) wird standardmäßig, in Form von generiert host/ < Hostname> da Diese Konten haben Zugriff auf den Computer-SPN-Daten.If the service is running under the LocalSystem, LocalService, or NetworkService account, a service principal name (SPN) is generated by default in the form of host/<hostname> because those accounts have access to the computer's SPN data. Wenn der Dienst unter einem anderen Konto ausgeführt wird, generiert Windows Communication Foundation (WCF) einen UPN im Format < Benutzername>@<DomainName > .If the service is running under a different account, Windows Communication Foundation (WCF) generates a UPN in the form of <username>@<domainName>. Die Kerberos-Authentifizierung erfordert nämlich, dass für den Client ein UPN oder SPN zum Authentifizieren des Dienstes bereitgestellt wird.This occurs because Kerberos authentication requires that a UPN or SPN be supplied to the client to authenticate the service.

Sie können auch das Tool Setspn.exe zur Registrierung eines zusätzlichen SPN beim Konto eines Dienstes in einer Domäne verwenden.You can also use the Setspn.exe tool to register an additional SPN with a service's account in a domain. Sie können dann den SPN als die Identität des Dienstes verwenden.You can then use the SPN as the identity of the service. Zum Herunterladen des Tools finden Sie unter Windows 2000 Resource Kit Tool: Setspn.exe.To download the tool, see Windows 2000 Resource Kit Tool : Setspn.exe. Weitere Informationen zu diesem Tool finden Sie unter Übersicht über Setspn.For more information about the tool, see Setspn Overview.

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.To use the Windows credential type without negotiation, the service's user account must have access to the SPN that is registered with the Active Directory domain. Dazu stehen Ihnen folgende Möglichkeiten zur Verfügung:You can do this in the following ways:

  • Verwenden Sie das NetworkService- oder das LocalSystem-Konto, um den Dienst auszuführen.Use the NetworkService or LocalSystem account to run your service. Da diese Konten Zugriff auf die Computer-SPN, die hergestellt wird haben, wenn der Computer die Active Directory-Domäne beitritt, generiert WCF automatisch den richtige SPN-Element im Endpunkt des Diensts in den Dienstmetadaten (WSDL).Because those accounts have access to the machine SPN that is established when the machine joins the Active Directory domain, WCF automatically generates the proper SPN element inside the service's endpoint in the service's metadata (WSDL).

  • Verwenden Sie ein beliebiges Active Directory-Domänenkonto, um den Dienst auszuführen.Use an arbitrary Active Directory domain account to run your service. Erstellen Sie in diesem Fall mit dem Tool Setspn.exe einen SPN für dieses Domänenkonto.In this case, establish an SPN for that domain account, which you can do by using the Setspn.exe utility tool. Konfigurieren Sie nach dem Erstellen des SPN für das Konto des Diensts WCF um, dass dieser SPN für den Dienst Clients über seine Metadaten (WSDL) veröffentlicht.Once you create the SPN for the service's account, configure WCF to publish that SPN to the service's clients through its metadata (WSDL). Legen Sie dazu die Endpunktidentität für den angezeigten Endpunkt entweder mit einer Anwendungskonfigurationsdatei oder mit Code fest.This is done by setting the endpoint identity for the exposed endpoint, either through an application configuration file or code.

Weitere Informationen zu SPNs, die Kerberos-Protokoll und Active Directory finden Sie unter technische Kerberos-Ergänzung für Windows.For more information about SPNs, the Kerberos protocol, and Active Directory, see Kerberos Technical Supplement for Windows.

Wenn SPN oder UPN der leeren Zeichenfolge entsprichtWhen SPN or UPN Equals the Empty String

Das Festlegen von SPN oder UPN gleich einer leeren Zeichenfolge führt abhängig von der Sicherheitsebene und dem verwendeten Authentifizierungsmodus zu verschiedenen Ergebnissen:If you set the SPN or UPN equal to an empty string, a number of different things happen, depending on the security level and authentication mode being used:

  • Wenn Sie Sicherheit auf Transportebene verwenden, wird die NT LanMan (NTLM)-Authentifizierung ausgewählt.If you are using transport level security, NT LanMan (NTLM) authentication is chosen.

  • Wenn Sie Sicherheit auf Nachrichtenebene verwenden, schlägt die Authentifizierung abhängig vom Authentifizierungsmodus möglicherweise fehl:If you are using message level security, authentication may fail, depending on the authentication mode:

  • Wenn Sie den spnego-Modus verwenden und das AllowNtlm-Attribut auf false festgelegt ist, schlägt die Authentifizierung fehl.If you are using spnego mode and the AllowNtlm attribute is set to false, authentication fail.

  • Verwenden Sie den spnego-Modus verwenden und ist das AllowNtlm-Attribut auf true festgelegt, schlägt die Authentifizierung fehl, wenn der UPN leer ist; sie ist jedoch erfolgreich, wenn der SPN leer ist.If you are using spnego mode and the AllowNtlm attribute is set to true, authentication fails if the UPN is empty, but succeeds if the SPN is empty.

  • Wenn Sie Kerberos direkt (wird auch als "One-Shot" bezeichnet) verwenden, schlägt die Authentifizierung fehl.If you are using Kerberos direct (also known as "one-shot"), authentication fails.

Mithilfe der <Identity >-Elements in der KonfigurationUsing the <identity> Element in Configuration

Wenn Sie den Clientanmeldeinformationstyp in der zuvor gezeigten Bindung zu Certificate, ändern, enthält die generierte WSDL ein serialisiertes Base64-X.509-Zertifikat als Identitätswert, wie im folgenden Code gezeigt.If you change the client credential type in the binding previously shown to Certificate, then the generated WSDL contains a Base64 serialized X.509 certificate for the identity value as shown in the following code. Dies ist der Standard für alle Clientanmeldeinformationstypen außer Windows.This is the default for all client credential types other than Windows.

Sie können den Wert der standardmäßigen Dienstidentität oder den Typ der Identität mit dem <identity>-Element bei der Konfiguration oder durch Festlegen der Identität im Code ändern.You can change the value of the default service identity or change the type of the identity by using the <identity> element in configuration or by setting the identity in code. Der folgende Konfigurationscode legt eine DNS-Identität (Domain Name System) mit dem Wert contoso.com fest.The following configuration code sets a domain name system (DNS) identity with the value contoso.com.

Programmgesteuertes Festlegen der IdentitätSetting Identity Programmatically

Der Dienst verfügt nicht explizit eine Identität angeben, da WCF automatisch bestimmt.Your service does not have to explicitly specify an identity, because WCF automatically determines it. WCF ermöglicht Ihnen die Angabe eine Identität für einen Endpunkt jedoch bei Bedarf.However, WCF allows you to specify an identity on an endpoint, if required. Mit dem folgenden Code wird ein neuer Dienstendpunkt mit einer bestimmten DNS-Identität hinzugefügt.The following code adds a new service endpoint with a specific DNS identity.

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

Siehe auchSee Also

Vorgehensweise: Erstellen einer benutzerdefinierten ClientidentitätsüberprüfungHow to: Create a Custom Client Identity Verifier
Dienstidentität und AuthentifizierungService Identity and Authentication