Acceso denegado Al llamar a un servicio web mientras la autenticación anónima está desactivada

Este artículo le ayuda a resolver los errores (acceso denegado) que se producen al llamar a una aplicación de servicio web y la autenticación de acceso anónimo está desactivada.

Versión del producto original:   Mejoras de servicios web
Número KB original:   811318

Síntomas

Cuando intenta llamar a una aplicación de servicio web y la autenticación de acceso anónimo está desactivada, puede recibir el siguiente mensaje de error:

Error en la solicitud con el estado HTTP 401: Acceso denegado.
Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción: System.Net.WebException: Error en la solicitud con el estado HTTP 401: Acceso denegado.

Causa

Cuando la autenticación de acceso anónimo está desactivada para la aplicación de servicio web, todas las aplicaciones de autor de la llamada deben proporcionar las credenciales antes de realizar cualquier solicitud. De forma predeterminada, el proxy de cliente de servicio web no hereda las credenciales del contexto de seguridad donde se ejecuta la aplicación cliente de servicio web.

Para resolver este problema, debe usar la propiedad Credentials del proxy de cliente de servicio web para establecer las credenciales de seguridad para la autenticación de cliente de servicio web.

Para establecer la propiedad Credentials, use una de las siguientes resoluciones:

Resolución 1: Asignar DefaultCredentials a la propiedad Credentials

Asigne defaultcredentials a la propiedad Credentials de la clase Proxy de servicio web para llamar al servicio web mientras la autenticación de acceso anónimo está desactivada. La propiedad DefaultCredentials de la clase CredentialCache proporciona credenciales del sistema del contexto de seguridad donde se ejecuta la aplicación. Para ello, use el siguiente código:

Visual C# ejemplo de .NET

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

Visual Basic ejemplo de .NET

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

Resolución 2: Usar la clase CredentialCache

Puede usar la clase CredentialCache para proporcionar credenciales para la autenticación de cliente de servicio web. Cree una instancia de la clase CredentialCache. Cree una instancia de NetworkCredential que use el nombre de usuario, la contraseña y el dominio especificados. Agregue NetworkCredential a la clase CredentialCache con el tipo de autenticación. Para ello, use el siguiente código:

Visual C# ejemplo de .NET

//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 ejemplo de .NET

'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

Nota

La clase CredentialCache y la clase NetworkCredential pertenecen al espacio System.Net de nombres.

Para obtener más información acerca de cómo establecer la propiedad Credentials, vea la sección Pasos para reproducir el comportamiento de este artículo.

Estado

Este comportamiento es una característica del diseño de la aplicación.

Pasos para reproducir el comportamiento

DefaultCredentials representa las credenciales del sistema para el contexto de seguridad actual en el que se ejecuta la aplicación. Para una aplicación del lado cliente, las credenciales predeterminadas suelen ser Windows como el nombre de usuario, la contraseña y el dominio del usuario que ejecuta el programa. Para ASP.NET programas, las credenciales predeterminadas son las credenciales de usuario de la identidad del proceso de trabajo ASP.NET o el usuario que se está suplantando. En el siguiente programa ASP.NET de ejemplo, DefaultCredentials representa la cuenta de usuario aspnet (o cuenta de usuario de NetworkService para aplicaciones que se ejecutan en Microsoft Internet Information Services [IIS] 6.0) porque no se establece ninguna suplantación en el autor de la llamada.

  1. Cree un nuevo ASP.NET web mediante Visual C# .NET o Visual Basic .NET.

  2. Asigne al proyecto el nombre WebServiceTest.

  3. De forma predeterminada, se crea Service1.asmx.

  4. Descomprima el método web predeterminado "HelloWorld()".

  5. En el menú Generar, seleccione Generar solución.

  6. Desactivar el acceso anónimo a WebServiceTest. Para ello, siga estos pasos:

    1. En el Panel de control, haga doble clic en Herramientas administrativas.

    2. Haga doble clic en Internet Information Services.

    3. Expanda Internet Information Services y, a continuación, busque el directorio virtual WebServiceTest.

    4. Haga clic con el botón secundario en WebServiceTest y, a continuación, seleccione Propiedades.

    5. Seleccione la pestaña Seguridad del directorio.

    6. En Control de autenticación y acceso anónimo, seleccione Editar.

    7. En el cuadro de diálogo Métodos de autenticación, active la casilla Acceso anónimo.

    8. Active la casilla Autenticación Windows integrada.

      Nota

      Compruebe que solo se haya seleccionado Windows autenticación integrada.

    9. Seleccione Aceptar para cerrar el cuadro de diálogo Métodos de autenticación.

    10. Seleccione Aceptar para cerrar Propiedades.

  7. En el menú Generar, seleccione Generar solución.

  8. Escriba la siguiente dirección en el explorador para ver la descripción del servicio web service1:

    http://localhost/WebServiceTest/Service1.asmx

  9. Pruebe HelloWorld WebMethod. WebMethod funciona según lo esperado.

  10. Agregue una referencia web a una aplicación ASP.NET web. Para ello, siga estos pasos:

    1. Cree una nueva ASP.NET web mediante Visual C# .NET o Visual Basic .NET. Asigne al proyecto el nombre WebServiceCaller.

    2. De forma predeterminada, se crea WebForm1.aspx.

    3. En el Explorador de soluciones, haga clic con el botón secundario en Referencias y, a continuación, seleccione Agregar referencia web.

    4. En el cuadro de texto Dirección, escriba la dirección URL de WebServiceTest de la siguiente manera:

      http://localhost/WebServiceTest/Service1.asmx

    5. Seleccione Ir o presione ENTRAR y, a continuación, seleccione Agregar referencia.

  11. En el Explorador de soluciones, haga clic con el botón secundario en WebForm1.aspx y, a continuación, seleccione Ver código.

  12. Anexe el siguiente código a thePage_Loadevent:

    Ejemplo C# .NET:

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

    Visual Basic ejemplo de .NET:

    'Start an instance of the Web service client-side proxy.
    Dim myProxy As localhost.Service1 = New localhost.Service1()
    Response.Write(myProxy.HelloWorld())
    
  13. En el menú Depurar, seleccione Inicio y, a continuación, vea la aplicación en el explorador.

  14. El mensaje de error que se describe en la sección "Síntomas" aparece en el explorador.

  15. Para resolver este problema, asigne DefaultCredentials a la propiedad Credentials del proxy del lado cliente del servicio web. Para ello, inserte el siguiente código antes de la línea "Response.Write( myProxy.HelloWorld()":

    Ejemplo C# .NET:

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

    Visual Basic ejemplo de .NET:

    myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    
  16. Repita el paso 13.

Referencias