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:
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>
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
@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
¿El usuario que está utilizando para el acceso anónimo tiene derechos de lectura en su carpeta? –