2011-01-24 100 views
6

我遇到了我开发的asmx Web服务的授权错误。 Web服务本身不需要任何用户凭证,但似乎Web服务被配置为强制执行该操作,尽管我尝试设置允许匿名访问的配置:允许匿名访问的ASMX Web服务

我已设置相应的Web站点在IIS允许匿名访问:

Screenshot of IIS setting

而且在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> 
+0

有几件事......你可以发布关于客户端服务配置的测试客户端的web.config部分吗?另外,您是否尝试过在服务端使该方法保持静态?我知道在其他一些情况下(如常规的aspx页面),WebMethods必须是静态的,但我不记得asmx。 – Andrew 2011-01-28 08:02:11

+0

@Andrew:感谢您的评论。我已经为我的问题添加了更多的细节。我也尝试通过网络浏览器访问,所以app.config可能不太相关。我仍然添加它作为参考。您永远不知道... – chiccodoro 2011-01-28 08:50:12

+0

您用于匿名访问的用户是否拥有您的文件夹的阅读权限? – 2011-02-01 17:24:29

回答

0

配置为用于匿名访问的互联网访客帐户似乎存在问题。如果我将该帐户设置为不同的帐户,则工作正常。

0

是的,服务器需要配置,让您的网站的匿名访问。
<allow users="*" />是你需要做的(从.net部分)。

+0

我现在尝试并设置了匿名访问(请参阅上面的更新)。它仍然不起作用。 – chiccodoro 2011-01-25 07:59:18

+0

嗨SWeko,你介意再看看我的(更新)问题吗?我真的觉得迷失... – chiccodoro 2011-01-28 07:51:15

0

从.NET你必须允许所有的用户,你已经完成。您还必须将IIS配置为允许匿名访问。你如何认证其余的页面?

1

您是否检查过提供配置设置到您的应用程序的更高级别的web.config和/或machine.config?

6

*表示认证的用户,您需要使用?来代替。

拉升整个网站禁用身份验证:

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

做此项检查:创建test.txt文件,并尝试从Web浏览器访问它。你会得到'访问被拒绝'的错误?

接下来,尝试打开不存在的aspx页面,例如, blah.aspx。你应该得到404错误,而不是拒绝访问。