我遇到了我开发的asmx Web服务的授权错误。 Web服务本身不需要任何用户凭证,但似乎Web服务被配置为强制执行该操作,尽管我尝试设置允许匿名访问的配置:允许匿名访问的ASMX Web服务
我已设置相应的Web站点在IIS允许匿名访问:
而且在web.config
以下行我已经包括:
<configuration>
...
<system.web>
...
<authorization>
<allow users="*"/>
</authorization>
...
</system.web>
...
</configuration>
当试图调用从测试客户端web服务,我得到这个错误信息:
的HTTP请求是未经授权 客户端身份验证方案 “匿名”。从服务器收到的验证标头 是'NTLM'。
的代码调用Web服务的线路是这样的:
string message = new ServiceReference1.Service1SoapClient().HelloWorld();
和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";
}
}
的一些要点:
- 如果我尝试将客户端设置为使用NTLM进行身份验证,则可以正常工作。
- 如果我尝试设置客户端不进行身份验证,它将失败并显示上面的消息。
- 如果我尝试使用Web浏览器访问Web服务,我还会收到FORBIDDEN错误消息而不是预期的Web服务文档页面。
- 如果我从Visual Studio中运行Web服务并将客户端配置为访问该服务(本地主机...),则它工作正常。
- 请参阅以下甚至更多细节
我也试过,把授权标签指向Web服务的位置标签内:
<location path="Service1.asmx">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
这是怎么客户配置(app.config)看起来像(请注意,如上所述,我甚至无法使用Web浏览器访问该服务,因此我不认为客户端配置相关):
<?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>
任何想法?
更新:我发现了以下文件:
C:\WINNT\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles\web.config
是否有任何关联到自定义Web应用程序,如果是的话,不是我自己的web.config的设置将覆盖该文件的设置?
内容是文件:
<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>
虽然还有另外一个文件:
C:\WINNT\Microsoft.NET\Framework\v2.0.50727\config\web.config
而且我认为这相当是一个系统范围的web.config文件。这个文件实际上允许所有用户的访问:
<system.web>
<authorization>
<allow users="*"/>
</authorization>
有几件事......你可以发布关于客户端服务配置的测试客户端的web.config部分吗?另外,您是否尝试过在服务端使该方法保持静态?我知道在其他一些情况下(如常规的aspx页面),WebMethods必须是静态的,但我不记得asmx。 – Andrew 2011-01-28 08:02:11
@Andrew:感谢您的评论。我已经为我的问题添加了更多的细节。我也尝试通过网络浏览器访问,所以app.config可能不太相关。我仍然添加它作为参考。您永远不知道... – chiccodoro 2011-01-28 08:50:12
您用于匿名访问的用户是否拥有您的文件夹的阅读权限? – 2011-02-01 17:24:29