Debuggen von Windows-AuthentifizierungsfehlernDebugging Windows Authentication Errors

Bei Verwendung der Windows-Authentifizierung als Sicherheitsmechanismus wickelt die Security Support Provider-Schnittstelle (SSPI) Sicherheitsprozesse ab.When using Windows authentication as a security mechanism, the Security Support Provider Interface (SSPI) handles security processes. Wenn Sicherheitsfehler auf der SSPI-Schicht auftreten, werden sie von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) festgestellt.When security errors occur at the SSPI layer, they are surfaced by Windows Communication Foundation (WCF)Windows Communication Foundation (WCF). Dieses Thema enthält ein Framework und eine Reihe von Fragen zur Diagnose der Fehler.This topic provides a framework and set of questions to help diagnose the errors.

Einen Überblick über das Kerberos-Protokoll finden Sie unter Kerberos erläutert– bzw. für ein Überblick über die SSPI, finden Sie unter SSPI.For an overview of the Kerberos protocol, see Kerberos Explained; for an overview of SSPI, see SSPI.

Für Windows-Authentifizierung WCFWCF in der Regel verwendet die Negotiate Security Support Provider (SSP), die gegenseitige Kerberos-Authentifizierung zwischen Client und Dienst durchführt.For Windows authentication, WCFWCF typically uses the Negotiate Security Support Provider (SSP), which performs Kerberos mutual authentication between the client and service. Wenn das Kerberos-Protokoll nicht verfügbar ist, greift WCFWCF standardmäßig auf NT-LAN-Manager (NTLM) zurück.If the Kerberos protocol is not available, by default WCFWCF falls back to NT LAN Manager (NTLM). Sie können WCFWCF jedoch so konfigurieren, dass nur das Kerberos-Protokoll verwendet wird (und dass eine Ausnahme ausgelöst wird, wenn Kerberos nicht verfügbar ist).However, you can configure WCFWCF to use only the Kerberos protocol (and to throw an exception if Kerberos is not available). Sie können WCFWCF auch so konfigurieren, dass eingeschränkte Formen des Kerberos-Protokolls verwendet werden.You can also configure WCFWCF to use restricted forms of the Kerberos protocol.

DebugmethodikDebugging Methodology

Die grundlegende Methode lautet wie folgt:The basic method is as follows:

  1. Bestimmen Sie, ob Sie die Windows-Authentifizierung verwenden.Determine whether you are using Windows authentication. Wenn Sie ein anderes Schema verwenden, ist dieses Thema irrelevant.If you are using any other scheme, this topic does not apply.

  2. Wenn Sie sicher sind, dass Sie die Windows-Authentifizierung verwenden, bestimmen Sie, ob Ihre WCFWCF-Konfiguration Kerberos direkt oder "Negotiate" verwendet.If you are sure you are using Windows authentication, determine whether your WCFWCF configuration uses Kerberos direct or Negotiate.

  3. Nachdem Sie festgestellt haben, ob Ihre Konfiguration das Kerberos-Protokoll oder NTLM verwendet, können Sie Fehlermeldungen im richtigen Kontext verstehen.Once you have determined whether your configuration is using the Kerberos protocol or NTLM, you can understand error messages in the correct context.

Verfügbarkeit des Kerberos-Protokolls und von NTLMAvailability of the Kerberos Protocol and NTLM

Der Kerberos SSP erfordert einen Domänencontroller, der als Kerberos Key Distribution Center (KDC) fungiert.The Kerberos SSP requires a domain controller to act as the Kerberos Key Distribution Center (KDC). Das Kerberos-Protokoll ist nur verfügbar, wenn sowohl der Client als auch der Dienst Domänenidentitäten verwenden.The Kerberos protocol is available only when both the client and service are using domain identities. In anderen Kontokombinationen wird NTLM verwendet, wie in der folgenden Tabelle zusammengefasst.In other account combinations, NTLM is used, as summarized in the following table.

Die Tabellenheader zeigen mögliche vom Server verwendete Kontotypen.The table headers show possible account types used by the server. Die linke Spalte zeigt mögliche vom Client verwendete Kontotypen.The left column shows possible account types used by the client.

Lokaler BenutzerLocal User Lokales SystemLocal System DomänenbenutzerDomain User DomänencomputerDomain Machine
Lokaler BenutzerLocal User NTLMNTLM NTLMNTLM NTLMNTLM NTLMNTLM
Lokales SystemLocal System Anonymous NTLMAnonymous NTLM Anonymous NTLMAnonymous NTLM Anonymous NTLMAnonymous NTLM Anonymous NTLMAnonymous NTLM
DomänenbenutzerDomain User NTLMNTLM NTLMNTLM KerberosKerberos KerberosKerberos
DomänencomputerDomain Machine NTLMNTLM NTLMNTLM KerberosKerberos KerberosKerberos

Zu den vier Kontotypen gehören im Einzelnen:Specifically, the four account types include:

  • Lokaler Benutzer: Nur Computerbenutzerprofil.Local User: Machine-only user profile. Beispiel: MachineName\Administrator oder MachineName\ProfileName.For example: MachineName\Administrator or MachineName\ProfileName.

  • Lokales System: Das integrierte Konto SYSTEM auf einem Computer, der nicht mit einer Domäne verknüpft ist.Local System: The built-in account SYSTEM on a machine that is not joined to a domain.

  • Domänenbenutzer: Ein Benutzerkonto auf einer Windows-Domäne.Domain User: A user account on a Windows domain. Beispiel: DomainName\ProfileName.For example: DomainName\ProfileName.

  • Domänencomputer: Ein Prozess mit Computeridentität, der auf einem Computer ausgeführt wird, der mit einer Windows-Domäne verknüpft ist.Domain Machine: A process with machine identity running on a machine joined to a Windows domain. Beispiel: MachineName\Network Service.For example: MachineName\Network Service.

Hinweis

Die Dienstanmeldeinformationen werden aufgezeichnet, wenn die Open-Methode der ServiceHost-Klasse aufgerufen wird.The service credential is captured when the Open method of the ServiceHost class is called. Die Clientanmeldeinformationen werden immer dann gelesen, wenn der Client eine Nachricht sendet.The client credential is read whenever the client sends a message.

Allgemeine Windows-AuthentifizierungsproblemeCommon Windows Authentication Problems

In diesem Abschnitt werden einige allgemeine Windows-Authentifizierungsprobleme und mögliche Abhilfen erläutert.This section discusses some common Windows authentication problems and possible remedies.

Kerberos-ProtokollKerberos Protocol

SPN-/UPN-Probleme mit dem Kerberos-ProtokollSPN/UPN Problems with the Kerberos Protocol

Bei Verwendung der Windows-Authentifizierung und des Kerberos-Protokolls oder der Aushandlung durch SSPI muss die vom Clientendpunkt verwendete URL den vollqualifizierten Domänennamen des Diensthosts in der Dienst-URL enthalten.When using Windows authentication, and the Kerberos protocol is used or negotiated by SSPI, the URL the client endpoint uses must include the fully qualified domain name of the service's host inside the service URL. Dabei wird vorausgesetzt, dass das Konto, unter dem der Dienst ausgeführt wird, Zugriff auf den (Standard-) Dienstprinzipalnamen (SPN) Dienstschlüssel, die erstellt wird hat, wenn der Computer der Active Directory-Domäne, der am häufigsten hinzugefügt wurde durch Ausführen des Dienstes unter erfolgt die Netzwerkdienstkonto.This assumes that the account under which the service is running has access to the machine (default) service principal name (SPN) key that is created when the computer is added to the Active Directory domain, which is most commonly done by running the service under the Network Service account. Wenn der Dienst keinen Zugriff auf den SPN-Schlüssel des Computers hat, müssen Sie den korrekten SPN oder Benutzerprinzipalnamen (UPN) des Kontos, unter dem der Dienst ausgeführt wird, in der Endpunktidentität des Clients angeben.If the service does not have access to the machine SPN key, you must supply the correct SPN or user principal name (UPN) of the account under which the service is running in the client's endpoint identity. Weitere Informationen finden Sie unterFor more information aboutwie WCFWCF mit SPN- und UPN, finden Sie unter -Dienstidentität und Authentifizierung. how WCFWCF works with SPN and UPN, see Service Identity and Authentication.

Eine gängige Praxis für Lastenausgleichszenarien (beispielsweise bei Webfarmen und Webgärten) ist das Definieren eines eindeutigen Kontos für die einzelnen Anwendungen. Anschließend wird dem Konto ein SPN zugewiesen und sichergestellt, dass alle Dienste der Anwendung in diesem Konto ausgeführt werden.In load-balancing scenarios, such as Web farms or Web gardens, a common practice is to define a unique account for each application, assign an SPN to that account, and ensure that all of the application's services run in that account.

Zum Erhalten eines SPN für das Konto des Diensts müssen Sie Active Directory-Domänenadministrator sein.To obtain an SPN for your service's account, you need to be an Active Directory domain administrator. Weitere Informationen finden Sie unterFor more information, seeKerberos – technische Ergänzungfür Windows. Kerberos Technical Supplement for Windows.

Kerberos-Protokoll Direct erfordert, dass der Dienst unter einem Domänencomputerkonto ausgeführt wirdKerberos Protocol Direct Requires the Service to Run Under a Domain Machine Account

Dieser Fehler tritt auf, wenn die ClientCredentialType-Eigenschaft auf Windows und die NegotiateServiceCredential-Eigenschaft auf false festgelegt ist, wie im folgenden Code dargestellt.This occurs when the ClientCredentialType property is set to Windows and the NegotiateServiceCredential property is set to false, as shown in the following code.

WSHttpBinding b = new WSHttpBinding();
// By default, the WSHttpBinding uses Windows authentication 
// and Message mode.
b.Security.Message.NegotiateServiceCredential = false;
Dim b As New WSHttpBinding()
' By default, the WSHttpBinding uses Windows authentication 
' and Message mode.
b.Security.Message.NegotiateServiceCredential = False

Zum Beheben des Fehlers führen Sie den Dienst mit einem Domänencomputerkonto, wie Netzwerkdienst, auf einem Computer aus, der mit einer Domäne verknüpft ist.To remedy, run the service using a Domain Machine account, such as Network Service, on a domain joined machine.

Delegierung erfordert eine Anmeldeinformationen-AushandlungDelegation Requires Credential Negotiation

Um das Kerberos-Authentifizierungsprotokoll mit Delegierung zu verwenden, müssen Sie das Kerberos-Protokoll mit Anmeldeinformationen-Aushandlung (mitunter als "bilaterales" oder "mehrstufiges" Kerberos bezeichnet) implementieren.To use the Kerberos authentication protocol with delegation, you must implement the Kerberos protocol with credential negotiation (sometimes called "multi-leg" or "multi-step" Kerberos). Wenn Sie die Kerberos-Authentifizierung ohne Anmeldeinformationen-Aushandlung (mitunter als "One-Shot"-Kerberos bezeichnet) implementieren, wird eine Ausnahme ausgelöst.If you implement Kerberos authentication without credential negotiation (sometimes called "one-shot" or "single-leg" Kerberos), an exception will be thrown.

Um Kerberos mit Anmeldeinformationen-Aushandlung zu implementieren, führen Sie die folgenden Schritte aus:To implement Kerberos with credential negotiation, do the following steps:

  1. Implementieren Sie die Delegierung, indem Sie AllowedImpersonationLevel auf Delegation festlegen.Implement delegation by setting AllowedImpersonationLevel to Delegation.

  2. SSPI-Aushandlung erforderlich:Require SSPI negotiation:

    1. Wenn Sie Standardbindungen verwenden, legen Sie die NegotiateServiceCredential-Eigenschaft auf true fest.If you are using standard bindings, set the NegotiateServiceCredential property to true.

    2. Bei Verwendung von benutzerdefinierten Bindungen legen Sie das AuthenticationMode-Attribut des Security-Elements auf SspiNegotiated fest.If you are using custom bindings, set the AuthenticationMode attribute of the Security element to SspiNegotiated.

  3. Legen Sie fest, dass die SSPI-Aushandlung Kerberos verwenden muss, indem Sie die Verwendung von NTLM nicht zulasssen:Require the SSPI negotiation to use Kerberos by disallowing the use of NTLM:

    1. Führen Sie dies mit der folgenden Anweisung in Code aus: ChannelFactory.Credentials.Windows.AllowNtlm = falseDo this in code, with the following statement: ChannelFactory.Credentials.Windows.AllowNtlm = false

    2. Sie können diese Einstellung auch in der Konfigurationsdatei vornehmen, indem Sie das allowNtlm-Attribut auf false festlegen.Or you can do this in the configuration file by setting the allowNtlm attribute to false. Dieses Attribut ist Bestandteil der <Windows >.This attribute is contained in the <windows>.

NTLM-ProtokollNTLM Protocol

SSP-Aushandlung greift auf NTLM zurück, NTLM ist jedoch deaktiviertNegotiate SSP Falls Back to NTLM, but NTLM Is Disabled

Die AllowNtlm-Eigenschaft ist auf false festgelegt, wodurch von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) ein Best-Effort-Versuch unternommen wird, um bei Verwendung von NTLM eine Ausnahme auszulösen.The AllowNtlm property is set to false, which causes Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) to make a best-effort to throw an exception if NTLM is used. Durch das Festlegen dieser Eigenschaft auf false wird unter Umständen nicht verhindert, dass NTLM-Anmeldeinformationen über die Verbindung gesendet werden.Note that setting this property to false may not prevent NTLM credentials from being sent over the wire.

Die folgenden Schritte zeigen, wie ein Zurückgreifen auf NTLM deaktiviert wird.The following shows how to disable fallback to NTLM.

CalculatorClient cc = new 
    CalculatorClient("WSHttpBinding_ICalculator");
cc.ClientCredentials.Windows.AllowNtlm = false;
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.Windows.AllowNtlm = False

Fehler bei der NTLM-AnmeldungNTLM Logon Fails

Die Clientanmeldeinformationen sind im Dienst nicht gültig.The client credentials are not valid on the service. Überprüfen Sie, ob Benutzername und Kennwort richtig eingestellt sind und einem Konto entsprechen, das dem Computer, auf dem der Dienst ausgeführt wird, bekannt ist.Check that the user name and password are correctly set and correspond to an account that is known to the computer where the service is running. NTLM verwendet die angegebenen Anmeldeinformationen, um sich am Computer des Diensts anzumelden.NTLM uses the specified credentials to log on to the service's computer. Während die Anmeldeinformationen auf dem Computer, auf dem der Client ausgeführt wird, gültig sein können, schlägt diese Anmeldung fehl, wenn die Anmeldeinformationen für den Computer des Diensts nicht gültig sind.While the credentials may be valid on the computer where the client is running, this logon will fail if the credentials are not valid on the service's computer.

Anonyme NTLM-Anmeldung wird ausgeführt, anonyme Anmeldungen sind jedoch standardmäßig deaktiviertAnonymous NTLM Logon Occurs, but Anonymous Logons Are Disabled by Default

Beim Erstellen eines Clients wird die AllowedImpersonationLevel-Eigenschaft auf Anonymous festgelegt, wie im folgenden Beispiel veranschaulicht. Standardmäßig lässt der Server allerdings keine anonymen Anmeldungen zu.When creating a client, the AllowedImpersonationLevel property is set to Anonymous, as shown in the following example, but by default the server disallows anonymous logons. Dies tritt auf, da der Standardwert der AllowAnonymousLogons-Eigenschaft der WindowsServiceCredential-Klasse false ist.This occurs because the default value of the AllowAnonymousLogons property of the WindowsServiceCredential class is false.

Der folgende Clientcode versucht, anonyme Anmeldungen zu aktivieren (beachten Sie, dass die Standardeigenschaft Identification ist).The following client code attempts to enable anonymous logons (note that the default property is Identification).

CalculatorClient cc =
    new CalculatorClient("WSHttpBinding_ICalculator");
cc.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Anonymous;
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Anonymous

Der folgende Dienstcode ändert die Standardeinstellung, um anonyme Anmeldungen durch den Server zu aktivieren.The following service code changes the default to enable anonymous logons by the server.

Uri httpUri = new Uri("http://localhost:8000/");
ServiceHost sh = new ServiceHost(typeof(Calculator), httpUri);
sh.Credentials.WindowsAuthentication.AllowAnonymousLogons = true;
Dim httpUri As New Uri("http://localhost:8000/")
Dim sh As New ServiceHost(GetType(Calculator), httpUri)
sh.Credentials.WindowsAuthentication.AllowAnonymousLogons = True

Weitere Informationen finden Sie unterFor more information aboutIdentitätswechsel finden Sie unter Delegierung und Identitätswechsel. impersonation, see Delegation and Impersonation.

Alternativ wird der Client als Windows-Dienst ausgeführt und verwendet das integrierte Konto-SYSTEM.Alternatively, the client is running as a Windows service, using the built-in account SYSTEM.

Andere ProblemeOther Problems

Clientanmeldeinformationen werden nicht ordnungsgemäß festgelegt.Client Credentials Are Not Set Correctly

Die Windows-Authentifizierung verwendet die WindowsClientCredential-Instanz, die von der ClientCredentials-Eigenschaft der ClientBase<TChannel>-Klasse zurückgegeben wird, nicht UserNamePasswordClientCredential.Windows authentication uses the WindowsClientCredential instance returned by the ClientCredentials property of the ClientBase<TChannel> class, not the UserNamePasswordClientCredential. Im Folgenden wird ein nicht korrektes Beispiel dargestellt.The following shows an incorrect example.

CalculatorClient cc = new
    CalculatorClient("WSHttpBinding_ICalculator");            
cc.ClientCredentials.UserName.UserName = GetUserName(); // wrong!
cc.ClientCredentials.UserName.Password = GetPassword(); // wrong!
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.UserName.UserName = GetUserName() ' wrong!
cc.ClientCredentials.UserName.Password = GetPassword() ' wrong!

Im Folgenden wird ein korrektes Beispiel dargestellt.The following shows the correct example.

CalculatorClient cc = new 
    CalculatorClient("WSHttpBinding_ICalculator");
// This code returns the WindowsClientCredential type.            
cc.ClientCredentials.Windows.ClientCredential.UserName = GetUserName();
cc.ClientCredentials.Windows.ClientCredential.Password = GetPassword();
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
' This code returns the WindowsClientCredential type.            
cc.ClientCredentials.Windows.ClientCredential.UserName = GetUserName()
cc.ClientCredentials.Windows.ClientCredential.Password = GetPassword()

SSPI ist nicht verfügbarSSPI Is Not Available

Die folgenden Betriebssysteme unterstützen keine Windows-Authentifizierung bei Verwendung als Server: Windows XPWindows XP Home Edition, Windows XPWindows XP Media Center Edition und Windows VistaWindows VistaHome Edition.The following operating systems do not support Windows authentication when used as a server: Windows XPWindows XP Home Edition, Windows XPWindows XP Media Center Edition, and Windows VistaWindows VistaHome editions.

Entwickeln und Bereitstellen mit unterschiedlichen IdentitätenDeveloping and Deploying with Different Identities

Wenn Sie Ihre Anwendung auf einem bestimmten Computer entwickeln, die Anwendung anschließend auf einem anderen Computer bereitstellen und dabei unterschiedliche Kontotypen für die Authentifizierung verwenden, kann es vorkommen, dass sich das Verhalten von Computer zu Computer unterscheidet.If you develop your application on one machine, and deploy on another, and use different account types to authenticate on each machine, you may experience different behavior. Ein Beispiel: Angenommen, Sie entwickeln Ihre Anwendung auf einem Computer unter Windows XP Pro und verwenden dabei den SSPI Negotiated-Authentifizierungsmodus.For example, suppose you develop your application on a Windows XP Pro machine using the SSPI Negotiated authentication mode. Wenn die Authentifizierung unter Verwendung eines lokalen Benutzerkontos erfolgt, wird das NTLM-Protokoll verwendet.If you use a local user account to authenticate with, then NTLM protocol will be used. Nachdem die Entwicklung der Anwendung abgeschlossen ist, stellen Sie den Dienst für einen Computer unter Windows Server 2003 bereit, wo er im Rahmen eines Domänenkontos ausgeführt wird.Once the application is developed, you deploy the service to a Windows Server 2003 machine where it runs under a domain account. Der Dienst kann nun nicht mehr vom Client authentifiziert werden, da nun Kerberos und ein Domänencontroller verwendet werden.At this point the client will not be able to authenticate the service because it will be using Kerberos and a domain controller.

Siehe auchSee Also

WindowsClientCredential
WindowsServiceCredential
WindowsClientCredential
ClientBase<TChannel>
Delegierung und IdentitätswechselDelegation and Impersonation
Nicht unterstützte SzenarienUnsupported Scenarios