У меня есть веб-сервис, который использует базовую аутентификацию. У меня также есть приложение Windows Forms, которое использует веб-сервис. Когда он запускается, у пользователя запрашиваются учетные данные, которые затем используются при выполнении каких-либо запросов к службе.
Проблема в том, что приложение используется клиентом из корпоративной сети. Весь их интернет-трафик направляется через прокси-сервер, который использует проверку подлинности 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. И затем он будет использовать предоставленные пользователем учетные данные для выполнения базовой аутентификации на веб-службе.
UPDATE
Клиент попробовал это и получил ошибку 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)
Работает нормально, когда я пытаюсь с моей машины без прокси. Есть идеи почему?