2011-12-30 3 views
1

Я вызываю веб-службу через WCF (с .NET 4.0), для которой требуется базовая HTTP-аутентификация (с именем пользователя и паролем.) Через HTTPS. Хотя, я думаю, что у меня все правильно настроено, я получаю ошибку 401 всякий раз, когда я звоню в службу. Я отслеживал HTTP-трафик и заметил, что WCF, похоже, игнорирует то, что я сказал ему использовать заголовок авторизации с именем пользователя и паролем, поскольку ни один из них не отправлен в запросе. Вот моя конфигурация ниже. Есть идеи? Благодаря!Базовая HTTP-аутентификация через HTTPS с 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 таймаут) в System.ServiceModel.Channels.RequestChann el.Request (сообщение сообщения, тайм-аут TimeSpan) в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение сообщения, тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call (действие String, Boolean oneway, ProxyOperationRuntime operation, Object [] ins, Object [] аутов, тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime operation, Object [] ins, Object [] outs) в System.ServiceModel.Channels .ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, операция ProxyOperationRuntime) на System.ServiceModel.Channels.ServiceChannelProxy.Invoke (Шеззаде сообщение)

+0

Вы используете '' basicHttpBinding' над WSHttpBinding', потому что нужно поддерживать SOAP 1.1 клиентов? –

ответ

5

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

 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

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

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

+0

После мониторинга с Fiddler, он не выглядит так, как будто он отправляется вообще. Может быть, WCF не добавляет заголовок HTTP-авторизации перед отправкой запроса https? – Austin

Смежные вопросы