Базовая HTTP-аутентификация через HTTPS с WCF - PullRequest
1 голос
/ 30 декабря 2011

Я звоню в веб-службу через WCF (w / .NET 4.0), для которой требуется базовая HTTP-аутентификация (с именем пользователя и паролем) через HTTPS. Хотя я думаю, что все настроено правильно, я получаю сообщение об ошибке 401 всякий раз, когда я звоню в службу. Я отслеживал HTTP-трафик и заметил, что WCF, похоже, игнорирует то, что я сказал ему использовать заголовок авторизации с именем пользователя и паролем, поскольку в запросе ни один из них не отправляется. Вот моя конфигурация ниже. Есть идеи? Спасибо!

   <system.serviceModel>
         <bindings>
                <basicHttpBinding>
                       <binding name="BasicAuthSecured">
                             <security mode="Transport">
                                    <transport clientCredentialType="Basic" />
                             </security>
                       </binding>
                       </basicHttpBinding>
                </bindings>
         <client>
                <endpoint address="https://REMOVED FOR CONFIDENTIALITY"
            binding="basicHttpBinding" bindingConfiguration="BasicAuthSecured"
            contract="Five9.WsAdmin" name="WsAdminPort" />
         </client>
         <behaviors>
                <serviceBehaviors>
                       <behavior name="">
                             <serviceMetadata httpsGetEnabled="true"/>
                             <serviceDebug includeExceptionDetailInFaults="true"/>
                       </behavior>
                </serviceBehaviors>
         </behaviors>
   </system.serviceModel>

А вот и мой код:

        var five_9_client = new WsAdminClient();

        five_9_client.ClientCredentials.UserName.UserName = “REMOVED FOR CONFIDENTIALITY";
        five_9_client.ClientCredentials.UserName.Password = "REMOVED FOR CONFIDENTIALITY";

        var call_log_response = five_9_client.getCallLogReport(call_log); //Bombing out here

Я получаю это исключение:

{"HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Basic ». Заголовок аутентификации, полученный от сервера, был« »."}

С внутренним исключением:

{"Удаленный сервер возвратил ошибку: (401) не авторизован."}

С трассировкой стека:

в System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (запрос HttpWebRequest, ответ HttpWebResponse, WebException responseException, фабрика HttpChannelFactory) в System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse (запрос HttpWebRequest, ответ HttpWebResponse, фабрика HttpChannelFactory, WebException responseException, ChannelBinding channelBinding) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout) в System.ServiceModel.Channels.RequestChannel.Request (сообщение-сообщение, время ожидания TimeSpan) в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение-сообщение, время ожидания TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логический односторонний режим, операция ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout) в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логический односторонний режим, операция ProxyOperationRuntime, Object [] ins, Object [] outs) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, операция ProxyOperationRuntime) в System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение IMessage)

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Нашел решение: в основном проблема заключалась в том, что заголовок нужно было присоединить к текущему запросу, например так:

      var base_64_encoded_credentials =
            BasicHTTPAuthenticationEncoder.base_64_encode_credentials(
                client.ClientCredentials.UserName.UserName, client.ClientCredentials.UserName.Password);

        HttpRequestMessageProperty request = new HttpRequestMessageProperty();
        request.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + base_64_encoded_credentials;

        OperationContextScope clientScope = new OperationContextScope(five_9_client.InnerChannel);
        OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, request);
0 голосов
/ 31 декабря 2011

Возможно, проблема в том, что вы не задали тип учетных данных клиента, см. http://msdn.microsoft.com/en-us/library/ms731925.aspx

Либо он вообще не отправляется, либо тип учетных данных клиента по умолчанию не отправляет учетные данныев шапке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...