ASMX Web服务允许匿名访问

时间:2011-01-24 15:21:37

标签: asp.net web-services authentication asmx

我遇到了我开发的asmx Web服务的授权错误。 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();

以及网络服务的代码:

[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进行身份验证,则可以正常工作。
  • 如果我尝试将客户端设置为不进行身份验证,则会失败并显示上述消息。
  • 如果我尝试使用网络浏览器访问网络服务,我还会收到FORBIDDEN错误消息,而不是预期的网络服务文档页面。
  • 如果我从Visual Studio中运行Web服务并将客户端配置为访问该服务(localhost ...),则可以正常工作。
  • 有关详细信息,请参见下文

我还尝试将授权标记放在指向Web服务的位置标记中:

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

这就是客户端配置(app.config)的样子(请注意,如上所述,我甚至无法使用网络浏览器访问该服务,所以我不会考虑客户配置相关):

<?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>

5 个答案:

答案 0 :(得分:6)

*表示经过身份验证的用户,您需要使用?

尝试禁用整个网站的身份验证:

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

执行此检查:创建test.txt文件并尝试从Web浏览器访问它。您是否收到“拒绝访问”错误?

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

从.Net开始,您必须像以前一样允许所有用户。您还必须配置IIS以允许匿名访问。您如何对其余页面进行身份验证?

答案 4 :(得分:0)

配置为用于匿名访问的Internet访客帐户似乎存在问题。如果我将该帐户设置为其他帐户,则可以正常使用。