通过具有Windows(NTLM)身份验证的代理使用基本身份验证访问Web服务

时间:2011-05-27 15:51:12

标签: .net web-services proxy windows-authentication basic-authentication

我有一个使用基本身份验证的Web服务。我还有一个使用Web服务的Windows窗体应用程序。启动时,会要求用户提供凭据,然后在向服务发出任何请求时使用凭据。

问题是,应用程序由公司网络内的客户端使用。他们的所有互联网流量都通过使用Windows身份验证的代理进行路由。我正在尝试将我的应用程序配置为在发出请求时正确使用该代理。

到目前为止,我在客户端应用程序的app.config中有这个:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="mySoap" closeTimeout="00:02:00" openTimeout="00:02:00"
      receiveTimeout="00:10:00" sendTimeout="00:02:00" allowCookies="false"
      bypassProxyOnLocal="true" 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="TransportCredentialOnly">
        <transport clientCredentialType="Basic" proxyCredentialType="Windows"
          realm="myrealm" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://www.myservice.com/service.asmx"
    binding="basicHttpBinding" bindingConfiguration="mySoap"
    contract="MyPublicService.mySoap" name="mySoap" />
</client>
</system.serviceModel>
<system.net>
   <defaultProxy useDefaultCredentials="true" />
</system.net>

你认为这会起作用吗?我不能轻易测试它。应用程序和服务已在没有代理的情况下进行了测试,它们工作得很好,我只需要正确配置代理。

理论上,此配置将确保所有请求都使用默认代理,该代理使用Windows身份验证。它将使用默认凭据,这些凭据将在其Windows设置中设置。然后它将使用用户提供的凭据在Web服务上执行基本身份验证。

更新

客户尝试了这个并收到了400错误:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
    at System.Net.HttpWebRequest.GetResponse()
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
    --- End of inner exception stack trace ---

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

当我在没有代理的机器上尝试时,它工作正常。知道为什么吗?

1 个答案:

答案 0 :(得分:1)

400错误与问题无关。使用NTLM代理进行授权似乎正在使用此配置。

<强>更新

我更改了服务器的安全配置以接受Digest。然后在设置用户名和密码时必须对代码进行小的更改,它开始工作。看起来绑定在基本身份验证方面存在问题。