Zugriff verweigert, wenn Sie einen Webdienst aufrufen, während die anonyme Authentifizierung deaktiviert ist

Dieser Artikel hilft Ihnen bei der Behebung von Fehlern (Zugriff verweigert), die auftreten, wenn Sie eine Webdienstanwendung aufrufen und die Authentifizierung für anonymen Zugriff deaktiviert ist.

Ursprüngliche Produktversion:   Verbesserungen bei Webdiensten
Ursprüngliche KB-Nummer:   811318

Problembeschreibung

Wenn Sie versuchen, eine Webdienstanwendung aufzurufen, und die Authentifizierung für anonymen Zugriff deaktiviert ist, wird möglicherweise die folgende Fehlermeldung angezeigt:

Fehler bei der Anforderung mit HTTP-Status 401: Zugriff verweigert.
Beschreibung: Während der Ausführung der aktuellen Webanforderung ist eine unbehandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stapelüberwachung, um weitere Informationen zu dem Fehler und dem Ursprung des Fehlers im Code zu finden.
Ausnahmedetails: System.Net.WebException: Fehler bei der Anforderung mit HTTP-Status 401: Zugriff verweigert.

Ursache

Wenn die Authentifizierung für anonymen Zugriff für die Webdienstanwendung deaktiviert ist, müssen alle Aufruferanwendungen die Anmeldeinformationen angeben, bevor sie eine Anforderung stellen. Standardmäßig erbt der Webdienstclientproxy nicht die Anmeldeinformationen des Sicherheitskontexts, in dem die Webdienstclientanwendung ausgeführt wird.

Um dieses Problem zu beheben, müssen Sie die Credentials-Eigenschaft des Webdienstclientproxys verwenden, um die Sicherheitsanmeldeinformationen für die Webdienstclientauthentifizierung festzulegen.

Verwenden Sie eine der folgenden Auflösungen, um die Credentials-Eigenschaft festzulegen:

Auflösung 1: Zuweisen von DefaultCredentials zur Credentials-Eigenschaft

Weisen Sie die DefaultCredentials der Credentials-Eigenschaft der Webdienstproxyklasse zu, um den Webdienst aufzurufen, während die Authentifizierung für anonymen Zugriff deaktiviert ist. Die DefaultCredentials-Eigenschaft der CredentialCache-Klasse stellt Systemanmeldeinformationen des Sicherheitskontexts bereit, in dem die Anwendung ausgeführt wird. Verwenden Sie dazu den folgenden Code:

Visual C# .NET-Beispiel

//Assigning DefaultCredentials to the Credentials property
//of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;

Visual Basic .NET-Beispiel

'Assigning DefaultCredentials to the Credentials property
'of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials

Auflösung 2: Verwenden der CredentialCache-Klasse

Sie können die CredentialCache-Klasse verwenden, um Anmeldeinformationen für die Webdienstclientauthentifizierung bereitzustellen. Erstellen Sie eine Instanz der CredentialCache-Klasse. Erstellen Sie eine Instanz von NetworkCredential, die den angegebenen Benutzernamen, das Kennwort und die Domäne verwendet. Fügen Sie networkCredential der CredentialCache-Klasse mit dem Authentifizierungstyp hinzu. Verwenden Sie dazu den folgenden Code:

Visual C# .NET-Beispiel

//Create an instance of the CredentialCache class.
CredentialCache cache = new CredentialCache();

// Add a NetworkCredential instance to CredentialCache.
// Negotiate for NTLM or Kerberos authentication.
cache.Add( new Uri(myProxy.Url), "Negotiate", new NetworkCredential("UserName", "Password", "Domain")); 

//Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache;

Visual Basic .NET-Beispiel

'Create an instance of the CredentialCache class.
Dim cache As CredentialCache = New CredentialCache()

'Add a NetworkCredential instance to CredentialCache.
'Negotiate for NTLM or Kerberos authentication.
cache.Add(New Uri(myProxy.Url), "Negotiate", New NetworkCredential("UserName", "Password", "Domain"))

'Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache

Hinweis

Die CredentialCache-Klasse und die NetworkCredential-Klasse gehören zum System.Net Namespace.

Weitere Informationen zum Festlegen der Credentials-Eigenschaft finden Sie im Abschnitt "Schritte zum Reproduzieren des Verhaltens" in diesem Artikel.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Schritte zum Reproduzieren des Verhaltens

DefaultCredentials stellt die Systemanmeldeinformationen für den aktuellen Sicherheitskontext dar, in dem die Anwendung ausgeführt wird. Bei einer clientseitigen Anwendung sind die Standardanmeldeinformationen in der Regel die Windows Anmeldeinformationen wie Benutzername, Kennwort und Domäne des Benutzers, der das Programm ausführt. Bei ASP.NET Programmen sind die Standardanmeldeinformationen die Benutzeranmeldeinformationen der Identität für den ASP.NET Arbeitsprozess oder der Benutzer, dessen Identität angenommen wird. Im folgenden Beispiel ASP.NET Programms stellt DefaultCredentials das ASPNET-Benutzerkonto (oder das NetworkService-Benutzerkonto für Anwendungen dar, die auf Microsoft-Internetinformationsdienste [IIS] 6.0 ausgeführt werden), da kein Identitätswechsel auf den Aufrufer festgelegt ist.

  1. Erstellen Sie einen neuen ASP.NET Webdienst mit Visual C# .NET oder Visual Basic .NET.

  2. Benennen Sie das Projekt WebServiceTest.

  3. Standardmäßig wird "Service1.asmx" erstellt.

  4. Heben Sie die Auskommentierung der Standardwebmethod "HelloWorld()" auf.

  5. Wählen Sie im Menü "Erstellen" die Option "Projektmappe erstellen" aus.

  6. Deaktivieren Sie den anonymen Zugriff auf WebServiceTest. Gehen Sie dazu wie folgt vor:

    1. Doppelklicken Sie in der Systemsteuerung auf Verwaltung.

    2. Doppelklicken Sie auf Internetinformationsdienste.

    3. Erweitern Sie Internetinformationsdienste, und suchen Sie dann das virtuelle WebServiceTest-Verzeichnis.

    4. Klicken Sie mit der rechten Maustaste auf WebServiceTest, und wählen Sie dann Eigenschaften aus.

    5. Wählen Sie die Registerkarte "Verzeichnissicherheit" aus.

    6. Wählen Sie unter "Anonymer Zugriff und Authentifizierung" die Option "Bearbeiten" aus.

    7. Aktivieren Sie im Dialogfeld "Authentifizierungsmethoden" das Kontrollkästchen "Anonymer Zugriff".

    8. Aktivieren Sie das Kontrollkästchen "Integrierte Windows-Authentifizierung".

      Hinweis

      Stellen Sie sicher, dass nur die integrierte Windows Authentifizierung ausgewählt ist.

    9. Klicken Sie auf "OK", um das Dialogfeld "Authentifizierungsmethoden" zu schließen.

    10. Wählen Sie "OK" aus, um die Eigenschaften zu schließen.

  7. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

  8. Geben Sie die folgende Adresse im Browser ein, um die Service1-Webdienstbeschreibung anzuzeigen:

    http://localhost/WebServiceTest/Service1.asmx

  9. Testen Sie HelloWorld WebMethod. WebMethod funktioniert wie erwartet.

  10. Fügen Sie einem Test ASP.NET Webanwendung einen Webverweis hinzu. Gehen Sie dazu wie folgt vor:

    1. Erstellen Sie eine neue ASP.NET Webanwendung mit Visual C# .NET oder Visual Basic .NET. Benennen Sie das Projekt WebServiceCaller.

    2. Standardmäßig wird WebForm1.aspx erstellt.

    3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Verweise, und wählen Sie dann Webverweis hinzufügen aus.

    4. Geben Sie im Textfeld "Adresse" die URL für WebServiceTest wie folgt ein:

      http://localhost/WebServiceTest/Service1.asmx

    5. Klicken Sie auf "Los" oder drücken Sie die EINGABETASTE, und wählen Sie dann "Verweis hinzufügen" aus.

  11. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf WebForm1.aspx, und wählen Sie dann Code anzeigen aus.

  12. Fügen Sie den folgenden Code an thePage_Loadevent an:

    Visual C# .NET-Beispiel:

    // Start an instance of the Web service client-side proxy.
    localhost.Service1 myProxy = new localhost.Service1();
    Response.Write( myProxy.HelloWorld());
    

    Visual Basic .NET-Beispiel:

    'Start an instance of the Web service client-side proxy.
    Dim myProxy As localhost.Service1 = New localhost.Service1()
    Response.Write(myProxy.HelloWorld())
    
  13. Wählen Sie im Menü "Debuggen" die Option "Start" aus, und zeigen Sie die Anwendung dann im Browser an.

  14. Die im Abschnitt "Symptome" beschriebene Fehlermeldung wird im Browser angezeigt.

  15. Um dieses Problem zu beheben, weisen Sie defaultCredentials der Credentials-Eigenschaft des clientseitigen Webdienstproxys zu. Fügen Sie dazu den folgenden Code vor der Zeile "Response.Write( myProxy.HelloWorld())" ein:

    Visual C# .NET-Beispiel:

    myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
    

    Visual Basic .NET-Beispiel:

    myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    
  16. Wiederholen Sie Schritt 13.

References