2009-06-25 4 views
53

Я создал один сервис WCF и развернул его на сервере. Когда я просматриваю эту службу, она дает мне положительный ответ с URL-адресом wsdl. Теперь я пытаюсь протестировать сервис через клиент WCF Test. Он показывает правильные метаданные. Но когда я пытаюсь вызвать любой из метода от службы он показывает мне исключение ... вот ERRO детали с трассировки стека ..WCFTestClient HTTP-запрос неавторизован с помощью схемы аутентификации клиента «Анонимный»

Запрос HTTP является несанкционированным со схемой аутентификации клиента «Anonymous ». Заголовок аутентификации , полученный с сервера, был «Переговоры, NTLM».

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

на
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest запрос, ответ HttpWebResponse, WebException responseException, HttpChannelFactory завод)
Запрос HTTP является неавторизованный с клиентом схема аутентификации «Анонимный». Заголовок аутентификации , полученный от , был «Negotiate, NTLM».

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

на
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest запрос, HttpWebResponse ответ, WebException responseException, HttpChannelFactory завод)

Клиентские привязки:

<bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IServiceMagicService" 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="Text" 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="None"> 
       <transport clientCredentialType="Windows" proxyCredentialType="None" 
        realm="" /> 
       <message clientCredentialType="Windows" negotiateServiceCredential="true" 
        establishSecurityContext="true" /> 
      </security> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

привязок сервера:

<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> 
     </security> 
    </binding> 
    <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Раздел клиента клиента:

<client> 
    <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService" 
     contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" /> 
</client> 

Раздел Услуги Сервера:

<services> 
    <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior" 
    name="GeoService.Saveology.com.CityStateServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService" 
     contract="SEO.Common.ServiceContract.ICityStateService" /> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    </service> 
    <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior" 
    name="GeoService.Saveology.com.ServiceMagicServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" 
     contract="SEO.Common.ServiceContract.IServiceMagicService"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
    </service> 
</services> 
+0

ОК, спасибо - но вы должны также разместить раздела сервера, и раздел клиента, поэтому мы увидим, как эти конечные точки настроены и как вы вызываете их .... .. –

+0

Я также разместил раздел секции сайта dn сервера, а также раздел . – user82613

+0

Что происходит, когда вы вызываете эти методы с помощью реального клиента? –

ответ

9

У меня аналогичная проблема, вы пробовали:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = 
      System.Security.Principal.TokenImpersonationLevel.Impersonation; 
0

Только что получил эту проблему на машине для разработки (производство работает просто отлично). Я изменяю свою конфигурацию в IIS, чтобы разрешить анонимный доступ, и поместил мое имя и пароль в качестве учетных данных.

Не уверен, что я уверен, но он работает для тестирования.

6

Я вижу это еще не ответили, это точная цитата from here:

WSHttpBinding будет пытаться выполнить внутренний переговоры на уровне SSP.Чтобы это было успешным, вам нужно разрешить анонимность в IIS для VDir. Затем WCF по умолчанию выполняет SPNEGO для учетных данных окна. Разрешить анонимность на уровне IIS не разрешать никому, он откладывает стек WCF.

Я нашел это с помощью: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

После прибегая к помощи: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

+0

Hi @Irwin, Спасибо за ответ. Не могли бы вы предоставить более «официальный» источник, например, оригинальную документацию, подготовленную Microsoft, для того, чтобы оправдать это, аудитору? БОЛЬШОЕ СПАСИБО!! Marcelo –

70

я не имел контроль над конфигурацией безопасности для службы я звонил в, но получил ту же ошибку. Я смог исправить свой клиент следующим образом.

  1. В конфигурации, настройки режима безопасности:

    <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
    
  2. В коде, установите прокси-класс для олицетворения (я добавил ссылку на сервис под названием заказчика):

    Customer_PortClient proxy = new Customer_PortClient(); 
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  
         System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    
+2

Если вы делаете это программно, убедитесь, что вы используете Dim binding As New System.ServiceModel.BasicHttpBinding() вместо Dim binding As New System.ServiceModel.WSHttpBinding() –

+1

Я действительно не знаю, что такое Customer_PortClient, но настройка режим безопасности помог мне. – Nathan

+0

Защитная часть сделала трюк для меня! – nldev

3

Вот что мне нужно было сделать, чтобы эта работа работала. Это означает:

  1. Выборочная UserNamePasswordValidator (нет необходимости в ОС Windows учетной записи, SQLServer или ActiveDirectory - ваш UserNamePasswordValidator может иметь имя пользователя & пароль зашиты, или читать из текстового файла, MySQL или любой другой).
  2. HTTPS
  3. IIS7
  4. .net 4,0

Мой сайт управляется через DotNetPanel. Он имеет 3 варианта безопасности для виртуальных каталогов:

  1. Разрешить анонимный доступ
  2. Enable Basic Authentication
  3. Включение встроенной проверки подлинности Windows

только "Разрешить анонимный доступ" необходимо (хотя, что, само по себе было недостаточно).

Установка

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

Не сделать разницу в моем случае.

Однако, используя этот переплет работал:

 <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Windows" /> 
     <message clientCredentialType="UserName" /> 
     </security>   
3

Другим возможным решением этой ошибки, что я нашел. Возможно, не ответил на точный вопрос OP, но может помочь другим, которые наткнулись на это сообщение об ошибке.

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

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> 
</security> 

я должен был сделать:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); 
       binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
       binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows; 

, а также установка proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

+0

Отличный совет, спасибо! Не знаю, почему это было отклонено. – CompanyDroneFromSector7G

1

Попробуйте указать имя пользователя и пароль для своего клиента, например, ниже

client.ClientCredentials.UserName.UserName = @ "Domain \ username"; client.ClientCredentials.UserName.Password = "password";

0

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

В конце концов, оказалось, что внешняя служба имеет проверку IP. Новая среда в Azure имеет другой IP-адрес, и он был отклонен.

Так что, если вы когда-нибудь эта ошибка вызова внешних служб

Это может быть ограничение IP.

4

У меня была аналогичная проблема и попробовал все, что было предложено выше. Затем я попытался изменить clientCreditialType на Basic, и все сработало нормально.

<basicHttpBinding> 
    <binding name="BINDINGNAMEGOESHERE" > 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding>