2011-01-24 25 views
6

Tengo un error de autorización para un servicio web de asmx que desarrollé. El servicio web en sí no requiere ninguna credencial de usuario, pero parece que el servicio web está configurado para imponer eso, aunque traté de establecer la configuración para permitir el acceso anónimo:Servicio web ASMX para permitir el acceso anónimo

He configurado el sitio web correspondiente en IIS para permitir el acceso anónimo:

Screenshot of IIS setting

Otras he incluido las siguientes líneas en el web.config:

<configuration> 
    ... 
    <system.web> 
     ... 
     <authorization> 
      <allow users="*"/> 
     </authorization> 
     ... 
    </system.web> 
    ... 
</configuration> 

al intentar llamar la servicio web desde un cliente de prueba, me sale este mensaje de error:

La petición HTTP no está autorizado con el esquema de autenticación del cliente 'Anonymous'. El encabezado de autenticación recibido del servidor era 'NTLM'.

La línea de código llama al servicio web tiene el siguiente aspecto:

string message = new ServiceReference1.Service1SoapClient().HelloWorld(); 

Y el código del servicio web:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
public class Service1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string HelloWorld() 
    { 
     return "Hello World"; 
    } 
} 

Algunos puntos importantes:

  • Si intento configurar el cliente para que se autentique usando NTLM, funciona bien.
  • Si intento configurar al cliente para que no se autentique, falla con el mensaje anterior.
  • Si intento acceder al servicio web utilizando un navegador web, también aparece un mensaje de error PROHIBIDO en lugar de la página de documentación del servicio web esperada.
  • Si ejecuto el servicio web desde Visual Studio y configuro el cliente para acceder a ese servicio (localhost ...), funciona bien.
  • Véase más abajo para aún más detalles

También probé y poner la etiqueta de autorización dentro de una etiqueta de ubicación señalando el servicio web:

<location path="Service1.asmx"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

Ésta es la forma en que el cliente configuración (app.config) parece (tenga en cuenta que, como se mencionó anteriormente, ni siquiera puedo acceder al servicio utilizando un navegador web, por lo que no considero relevante la configuración del cliente):

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://name.of.the.server.example.org/Service1.asmx" 
       binding="basicHttpBinding" bindingConfiguration="Service1Soap" 
       contract="ServiceReference1.Service1Soap" name="Service1Soap" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

¿Alguna idea?


Actualización: He encontrado el siguiente archivo:

C:\WINNT\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles\web.config 

modo que carece de relevancia para una aplicación web a medida, y si es así, no la configuración de mi propia web.config anulan la configuración de ese archivo?

contenido de ese archivo:

<configuration> 
    <system.web> 
     <membership> 
      <providers> 
       <add name="WebAdminMembershipProvider" type="System.Web.Administration.WebAdminMembershipProvider" /> 
      </providers> 
     </membership> 
     <httpModules> 
      <add name="WebAdminModule" type="System.Web.Administration.WebAdminModule"/> 
     </httpModules> 
     <authentication mode="Windows"/> 
     <authorization> 
      <deny users="?"/> 
     </authorization> 
     <identity impersonate="true"/> 
     <trust level="Full"/> 
     <pages validateRequest="true"/> 
     <globalization uiCulture="auto:en-US" /> 
    </system.web> 
</configuration> 

Aunque hay otro archivo:

C:\WINNT\Microsoft.NET\Framework\v2.0.50727\config\web.config 

y yo creo que más bien éste es el archivo web.config de todo el sistema. Este archivo de hecho permite el acceso a todos los usuarios:

<system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
+0

Un par de cosas ... ¿Podría publicar la sección web.config del cliente de prueba que se refiere a la configuración del servicio del lado del cliente? Además, ¿ha intentado hacer el método estático en el lado del servicio? Sé que en otros contextos (como las páginas regulares de aspx), se requiere que WebMethods sea estático, pero no recuerdo para asmx. – Andrew

+0

@Andrew: gracias por tu comentario. He agregado algunos detalles más a mis preguntas. También intenté acceder a través del navegador web, por lo que la aplicación.config podría no ser demasiado relevante. Todavía lo agregué para referencia. Nunca se sabe ... – chiccodoro

+0

¿El usuario que está utilizando para el acceso anónimo tiene derechos de lectura en su carpeta? –

Respuesta

0

Parece haber un problema con la cuenta de invitado de Internet configurada para usar para el acceso anónimo. Si configuro esa cuenta en una diferente, funciona bien.

0

Sí, el servidor necesita ser configurado para permitir el acceso anónimo a su sitio.
El <allow users="*" /> es todo lo que necesita hacer (desde la parte de .net).

+0

Ahora intenté y establecí el acceso anónimo (ver actualización arriba). Todavía no funciona. – chiccodoro

+0

Hola SWeko, ¿te importaría echarle un vistazo a mi pregunta (actualizada)? Realmente me siento perdido ... – chiccodoro

0

De .Net debe permitir a todos los usuarios como ya lo hizo. También debe tener IIS configurado para permitir el acceso anónimo. ¿Cómo se autentica con el resto de las páginas?

+0

Ahora probé y configuré el acceso anónimo (ver actualización arriba). Todavía no funciona. – chiccodoro

+0

Hola, Smelch, ¿tienes más ideas después de leer mi pregunta (actualizada) nuevamente? – chiccodoro

1

¿Ha comprobado si hay un nivel superior de web.config y/o machine.config que contribuyen a la configuración de su aplicación?

+0

Encontré algo interesante, aunque no estoy seguro de qué tan relevante sea. Ver pregunta actualizada – chiccodoro

6

* significa usuarios autenticados, necesita usar ? en su lugar.

intente deshabilitar la autenticación para todo el sitio web:

<system.web> 
    <authentication mode="None" /> 
    <authorization> 
    <allow users="?" /> 
    </authorization> 
</system.web> 

hacer esta comprobación: crear test.txt archivo y intente acceder a él desde el navegador web. ¿Obtiene el error "Acceso denegado"?

A continuación, intente abrir una página aspx no existente, p. blah.aspx. Debería obtener el error 404, no acceso denegado.

+0

Desafortunadamente esto no cambió nada.Sin embargo, descubrí que era un problema con la cuenta configurada para acceso anónimo. – chiccodoro

+0

O inserte un archivo web.config en la carpeta que contiene el servicio que sobrescribirá la configuración de autorización – CRice

Cuestiones relacionadas