获取403 Forbidden错误。客户端身份验证方案“Anonymous”禁止HTTP请求

时间:2011-10-19 19:13:20

标签: c# wcf

我所遇到的这个问题并没有发生在所有访问我们服务的客户端上,但是一致的是,当错误发生时,它发生在少数客户的同一服务调用上。 / p>

以下是例外情况的详细信息:

  

System.ServiceModel.Security.MessageSecurityException HTTP请求   禁止使用客户端身份验证方案“Anonymous”。   System.ServiceModel.Security.MessageSecurityException:HTTP   请求被禁止使用客户端身份验证方案'Anonymous'。   的> ---> System.Net.WebException:远程服务器返回错误:(403)Forbidden。在System.Net.HttpWebRequest.GetResponse()处   System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度   超时)---内部异常堆栈跟踪结束---服务器   堆栈跟踪:at   System.ServiceModel.Security.IssuanceTokenProviderBase 1.DoNegotiation(TimeSpan timeout) at System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.TlsnegoTokenProvider.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(TimeSpan timeout) at System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider, TimeSpan timeout) at System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory {1.ClientSecurityChannel {1}} 1.ClientSecuritySessionChannel.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.CommunicationObject.Open(时间跨度   超时)at   System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
  在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan   超时)at   System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel   频道,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度   超时,CallOnceManager级联)at   System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度   超时)at   System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局)   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)在[0]处重新抛出异常:at   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天   reqMsg,IMessage retMsg)at   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&安培;   msgData,Int32类型)at   的> Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest   请求)在Proxy.FileTransferService.FileTransferServiceClient。   Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest   请求)在NormalFileTransferServiceClient.Download(Int32   packageId,IStreamWriter下载器,Archiver归档器)at   LoggingFileTransferServiceClient.Download(Int32 packageId,ISt

客户抛出了这个异常。

IFileTransferService的客户端代理配置为:

1.OnOpen(TimeSpan
  timeout)     at
  System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan
  timeout)     at
  System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation
  operation, EndpointAddress target, Uri via, SecurityToken
  currentToken, TimeSpan timeout)     at
  System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan
  timeout)     at
  System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan
  timeout)     at
  System.ServiceModel.Security.SecuritySessionClientSettings

服务配置

<binding name="WSHttpBinding_IFileTransferService" closeTimeout="00:01:00"
  openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
  bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
  maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom"
  textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
  <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  <reliableSession ordered="true" inactivityTimeout="00:10:00"
    enabled="false" />
  <security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
      realm="" />
    <message clientCredentialType="UserName" negotiateServiceCredential="true"
      algorithmSuite="Default" establishSecurityContext="true" />
  </security>
</binding>

  <endpoint address="http://[hostname]/FileTransferService.svc/FileTransfer"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFileTransferService"
    contract="Proxy.FileTransferService.IFileTransferService"
    name="WSHttpBinding_IFileTransferService">
    <identity>
      <certificate encodedValue="a long string"/>
    </identity>
  </endpoint>

注意:一些客户端正在使用basicHttpBinding(如果我正确设置了所有内容)。在客户端的后续版本中,可能尚未完全分发(这就是我必须支持2版本的原因),我更改了代理以使用wsHttpBinding端点。我想知道我得到的这个错误是否特定于basicHttp,如果是这样,也许我没有正确设置这些配置。我假设获得此403错误的客户端正在使用wsHttpBinding。

以下是该服务的代码:

<service behaviorConfiguration="ServiceBehavior" 
    name="Services.FileTransferService">
        <endpoint name="WSHttpBinding_IFileTransferService" 
       binding="wsHttpBinding" 
       bindingConfiguration="MtomWSHttpBinding" 
       contract="Services.IFileTransferService" 
       address="/FileTransfer"/>
        <endpoint binding="basicHttpBinding" 
       bindingConfiguration="FileTransferServicesBinding" 
       contract="Services.IFileTransferService"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://[hostname]/FileTransferService.svc"/>
          </baseAddresses>
        </host>
</service>

<binding name="wsHttpBinding" 
         maxReceivedMessageSize="2147483647" 
         receiveTimeout="5" 
         useDefaultWebProxy="false">
      <readerQuotas maxDepth="2147483647" 
             maxStringContentLength="2147483647" 
             maxArrayLength="2147483647" 
             maxBytesPerRead="2147483647" 
             maxNameTableCharCount="2147483647" />
  <security mode="Message">
    <message clientCredentialType="UserName" />
  </security>
</binding>

<basicHttpBinding>
    <binding name="FileTransferServicesBinding" 
           maxReceivedMessageSize="10067108864" 
           messageEncoding="Mtom" 
           transferMode="Streamed" 
           useDefaultWebProxy="false">
      <security mode="None">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>

是否有人知道如果摆脱这个异常是我控制范围内的事情?我可以在客户端或服务配置文件上进行任何配置更改吗?

如果您需要我的任何信息,请告诉我。

3 个答案:

答案 0 :(得分:3)

在我的情况下,此错误来自我们组织的 HTTP代理服务器。发现它来自: MessageSecurityException.InnerException.Response.Headers

{Mime-Version:1.0
X-Squid-Error:ERR_ACCESS_DENIED 0
X-Cache:来自&lt;
的MISS X-Cache-Lookup:无&lt;代理服务器地址&gt;
代理连接:关闭
内容长度:2165
内容类型:text / html
日期:2012年4月25日星期三,格林尼治标准时间10:55:39 服务器:squid / 3.0.STABLE25
通过:1.0 &lt; proxy-server-address&gt; (squid / 3.0.STABLE25)
}

在我的情况下,也发生了一个文件传输方法,该方法在大小为16384的byte数组中传输文件块。在将大小减小到10000时,错误得到了解决。这意味着代理服务器设置了某种大小限制。

在具有直接互联网访问权限的计算机上,文件传输方法永远不会因此错误而失败,即使对于数组大小&gt; 16384

由于只有部分客户遇到此问题,可能他们是在防火墙/代理服务器后面,实际阻止访问并返回此错误?

答案 1 :(得分:0)

听起来像接收MessageSecurityException的客户端没有提供有效的用户名/密码及其请求。

请参阅以下msdn主题http://msdn.microsoft.com/en-us/library/ms733131.aspx

答案 2 :(得分:0)

因此,您使用匿名身份验证在IIS中配置了Web服务,并且只有少数用户会收到403禁用错误。

根据我自己的经验,这通常是在访问ACL控制的系统资源(如文件系统)时由访问被拒绝的异常引起的。

每个异常连接的用户都会通过w3wp.exe进程处理其请求(假设是IIS 7),该进程通常具有应用程序池标识(IIS APPPOOL / AppPoolName),如果该标识未添加到任何所需的访问控制列表中访问被拒绝的异常将导致IIS响应403错误。

我通常会将应用程序池标识添加到组中,然后将该组添加到任何所需的资源中。

如果您无法确定可能导致异常的资源,请尝试在安全事件日志中查找“审核失败”条目以获取线索。您可能需要配置本地安全策略以记录安全事件。

祝你好运