WCF-Dienst, der asynchron in ASP.NET aufgerufen wird, verwendet den falschen Identitätswechsel

In diesem Artikel können Sie das Problem beheben, bei dem ein Windows Communication Foundation (WCF) Dienst, der asynchron in ASP.NET aufgerufen wird, den falschen Identitätswechsel verwendet.

Original Version des Produkts:   Windows Communication Foundation
Ursprüngliche KB-Nummer:   2890435

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Ein WCF-Dienst verwendet den Identitätswechsel und die Windows-Authentifizierung.
  • Ein WCF-Client ruft den Dienst asynchron auf.
  • Der Clientcode wird in der ASP.NET-Umgebung in Microsoft Internet Information Services (IIS) ausgeführt.

In diesem Szenario treten möglicherweise Probleme auf, bei denen der Dienstvorgang nicht unter dem beabsichtigten Identitätswechselkontext ausgeführt wird. Stattdessen wird möglicherweise feststellen, dass der Dienstvorgang unter der Identität des Prozesses, beispielsweise einem IIS-Anwendungs Pool, ausgeführt wird.

Hinweis

  • Wenn dieses Problem auftritt, wird keine Ausnahme ausgelöst, und aufgrund dieses Verlusts des Identitätswechsel Kontexts wird kein Fehler protokolliert.
  • Ein Beispiel für ein solches Szenario ist eine ASP.NET-Anwendung, die so konfiguriert ist, dass der eingehende Identitätswechselkontext asynchron an einen separaten WCF-Dienst delegiert wird.

Ursache

Dieses Problem tritt aufgrund der folgenden Faktoren auf:

  • Die Host-Common Language Runtime (CLR) unterdrückt absichtlich den Identitätswechselkontext, da ASP.net nicht für den Fluss WindowsIdentity über asynchrone Vorgänge konfiguriert wurde.
  • Wenn der Clientcode automatisch geöffnet wird und asynchrone Vorgänge auf dem WCF-Clientproxy unmittelbar aufruft, nachdem er erstellt wurde, wird der Identitätswechselkontext möglicherweise nicht ordnungsgemäß durchlaufen.

Lösung

Führen Sie die folgenden Schritte aus, um dieses Problem zu beheben:

  1. Konfigurieren von ASP.net für den Fluss WindowsIdentity über asynchrone Vorgänge. Stellen Sie dazu sicher, dass die aspnet.config Datei die folgenden Elemente aufweist:

    <configuration>
        <runtime>
            <legacyImpersonationPolicy enabled="false"/> 
            <alwaysFlowImpersonationPolicy enabled="true"/>
        </runtime>
    </configuration>
    

    Hinweis

    • Diese Einstellungen müssen in der aspnet.config Datei vorgenommen werden, da diese Einstellungen die CLR konfigurieren, die für den Anwendungspool verwendet wird. In web.config vorgenommene Einstellungen konfigurieren Sie nur die einzelne Anwendung, nicht den Anwendungspool.
    • Stellen Sie sicher, dass Sie den entsprechenden aspnet.config für das installierte Framework ändern, beispielsweise den %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\Aspnet.config Pfad.
    • Wenn Sie die aspnet.config Datei (en) für den Server nicht ändern können, beginnend mit IIS 7, können Sie jedem Anwendungs Pool eine benutzerdefinierte aspnet.config zuordnen. Weitere Informationen finden Sie im Abschnitt Weitere Informationen .
  2. Fügen Sie Open() dem Clientcode einen expliziten Aufruf hinzu. Nachdem Sie eine Instanz eines WCF-Clients erstellt haben, rufen Open() Sie die-Methode auf, bevor Sie Vorgänge asynchron aufrufen. Gehen Sie z. B. wie folgt vor:

    // Invoke a service operation asynchronously with impersonation.
    static async void Demo()
    {
       using (CalculatorClient client = new CalculatorClient())
       {
          // Enable the server to impersonate.
          client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
          // Open the client before the first asynchronous request.
          client.Open();
          // Invoke the Add operation asynchronously and display the result.
          double result = await client.AddAsync(1.0, 2.0);
          Console.WriteLine("Add returned {0}", result); client.Close();
       }
    }
    

Weitere Informationen

Das explizite Öffnen von Clientproxys, wenn Sie freigegeben oder asynchron verwendet werden, wird aus mehreren Gründen als bewährte Methode in WCF betrachtet. Weitere Informationen finden Sie unter bewährte Methode: immer Öffnen des WCF-Clientproxys explizit, wenn er freigegeben wird.

Weitere Informationen zu einem ähnlichen Problem, bei dem freigegebene Clientproxys und asynchrone Kommunikation verwendet werden, finden Sie unter WCF-Dienstvorgänge, die asynchron über freigegebene Clientproxys aufgerufen werden, indem der Identitätswechsel verwendet wird, kann der falsche Identitätswechselkontext verwenden.