Compartir a través de


Acceso denegado Cuando se llama a un servicio web mientras la autenticación anónima está desactivada

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

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

Síntomas

Al intentar 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 acerca del error y en donde se originó en el código.
Detalles de 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 llamada deben proporcionar las credenciales antes de realizar cualquier solicitud. De forma predeterminada, el proxy de cliente del servicio web no hereda las credenciales del contexto de seguridad en el que se ejecuta la aplicación cliente del servicio web.

Para resolver este problema, debe usar la propiedad Credentials del proxy de cliente del servicio web para establecer las credenciales de seguridad para la autenticación de cliente del 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, ejecute el siguiente código:

Ejemplo de .NET de Visual C#

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

Ejemplo de .NET de Visual Basic

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

Resolución 2: Uso de la clase CredentialCache

Puede usar la clase CredentialCache para proporcionar credenciales para la autenticación de cliente del 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, ejecute el siguiente código:

Ejemplo de .NET de Visual C#

//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;

Ejemplo de .NET de Visual Basic

'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 de nombres System.Net.

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

Status

Este comportamiento es por diseño.

Pasos para reproducir el comportamiento

DefaultCredentials representa las credenciales del sistema para el contexto de seguridad actual donde se ejecuta la aplicación. Para una aplicación del lado cliente, las credenciales predeterminadas suelen ser las credenciales de Windows, como el nombre de usuario, la contraseña y el dominio del usuario que ejecuta el programa. Para los programas de ASP.NET, las credenciales predeterminadas son las credenciales de usuario de la identidad del proceso de trabajo de ASP.NET o el usuario que se está suplantando. En el siguiente programa de ASP.NET de ejemplo, DefaultCredentials representa la cuenta de usuario de ASPNET (o la cuenta de usuario networkService para las 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 servicio web ASP.NET mediante Visual C# .NET o Visual Basic .NET.

  2. Asigne al proyecto el nombre WebServiceTest.

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

  4. Quite la marca de comentario del elemento WebMethod predeterminado "HelloWorld()".

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

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

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

    2. Haga doble clic en Internet Information Services.

    3. Expanda Internet Information Services y busque el directorio virtual WebServiceTest .

    4. Haga clic con el botón derecho en WebServiceTest y seleccione Propiedades.

    5. Seleccione la pestaña Seguridad de directorios.

    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. Seleccione esta casilla para activar la casilla Integrado autenticación de Windows.

      Nota:

      Compruebe que solo está seleccionada la autenticación de Windows integrada.

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

    10. SeleccioneAceptarpara cerrar Propiedades.

  7. En el menú Compilar, seleccione Compilar 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 previsto.

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

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

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

    3. En Explorador de soluciones, haga clic con el botón derecho en Referencias y 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 Explorador de soluciones, haga clic con el botón derecho en WebForm1.aspx y seleccione Ver código.

  12. Anexe el código siguiente a thePage_Loadevent:

    Ejemplo de .NET de Visual C#:

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

    Ejemplo de .NET de Visual Basic:

    '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 Iniciar 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 código siguiente antes de la línea "Response.Write( myProxy.HelloWorld()":

    Ejemplo de .NET de Visual C#:

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

    Ejemplo de .NET de Visual Basic:

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

Referencias