El servicio WCF que se invoca de forma asincrónica en ASP.NET usa la suplantación incorrecta

Este artículo le ayuda a resolver el problema en el que un servicio Windows Communication Foundation (WCF) que se invoca de forma asincrónica en ASP.NET usa la suplantación incorrecta.

Versión del producto original:   Windows Communication Foundation
Número KB original:   2890435

Síntomas

Imagine la siguiente situación:

  • Un servicio WCF usa suplantación y Windows autenticación.
  • Un cliente WCF invoca el servicio de forma asincrónica.
  • El código de cliente se ejecuta en el entorno ASP.NET en Microsoft Internet Information Services (IIS).

En este escenario, puede encontrarse con un problema en el que la operación de servicio no se ejecuta en el contexto de suplantación previsto. En su lugar, puede encontrar la operación de servicio ejecutándose bajo la identidad del proceso, como un grupo de aplicaciones de IIS.

Nota

  • Cuando se produce este problema, no se produce ninguna excepción y no se registra ningún error debido a esta pérdida del contexto de suplantación.
  • Un ejemplo de este escenario es una aplicación ASP.NET configurada para delegar el contexto de suplantación entrante en un servicio WCF independiente de forma asincrónica.

Causa

Este problema se produce debido a los siguientes factores:

  • Common Language Runtime (CLR) de host suprime deliberadamente el contexto de suplantación porque ASP.NET no se ha configurado para que fluya entre WindowsIdentity operaciones asincrónicas.
  • Si el código de cliente se basa en la apertura automática e invoca inmediatamente operaciones asincrónicas en el proxy de cliente WCF después de su creación, es posible que el contexto de suplantación no fluya correctamente.

Solución

Para resolver este problema, siga estos pasos:

  1. Configure ASP.NET para que WindowsIdentity fluya entre operaciones asincrónicas. Para ello, asegúrese de que el archivo aspnet.config tenga los siguientes elementos establecidos:

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

    Nota

    • Estas opciones deben realizarse en el archivoaspnet.config, ya que estas opciones configuran clr que se usará para el grupo de aplicaciones. Configuración en web.config configurar solo la aplicación individual, no el grupo de aplicaciones.
    • Asegúrese de cambiar la configuraciónaspnet.config para el marco instalado, como la ruta %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\Aspnet.config de acceso.
    • Si no puede cambiar los archivosaspnet.config del servidor, a partir de IIS 7, puede asociar unaspnet.configpersonalizado a cada grupo de aplicaciones. Para obtener más información, vaya a la sección Más información.
  2. Agregue una llamada Open() explícita al código de cliente. Después de crear una instancia de un cliente WCF, llame al método antes de Open() invocar cualquier operación de forma asincrónica. Por ejemplo, haga lo siguiente:

    // 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();
       }
    }
    

Más información

La apertura explícita de servidores proxy de cliente cuando se comparten o se usan de forma asincrónica se considera un procedimiento recomendado en WCF por varias razones. Para obtener más información, vea Procedimiento recomendado: Siempre abra el proxyde cliente WCF explícitamente cuando se comparta .

Para obtener más información acerca de un problema similar que usa servidores proxy de cliente compartidos y comunicación asincrónica, vea operaciones de servicio WCF invocadas asincrónicamente a través de servidores proxy de cliente compartidosmediante suplantación pueden usar el contexto de suplantación incorrecto.