WCFTestClient HTTP-запрос неавторизован с помощью схемы аутентификации клиента "Анонимный"
Я создал одну службу WCF и развернул ее на сервере. Когда я просматриваю эту службу, она дает мне положительный ответ с URL-адресом wsdl. Теперь я пытаюсь протестировать сервис через клиент WCF Test. Он показывает правильные метаданные. Но когда я пытаюсь вызвать какой-либо из методов из службы, он показывает мне исключение... вот эрро-детали со стеком трассировки.
HTTP-запрос несанкционирован схема проверки подлинности клиента 'Anonymous'. Заголовок проверки подлинности полученным с сервера, было 'Переговоры, NTLM'.
Трассировка стека сервера:
на авто System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest запрос, ответ HttpWebResponse, Исключение WebExceptionException, HttpChannelFactory factory)
HTTP-запрос неавторизован с клиентом схема аутентификации "Аноним". заголовок аутентификации, полученный из сервер был "Negotiate, NTLM".
Трассировка стека сервера:
на авто System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest запрос, ответ HttpWebResponse, Исключение WebExceptionException, HttpChannelFactory factory)
Клиентские привязки:
<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>
Ответы
Ответ 1
У меня не было контроля над конфигурацией безопасности для службы, в которую я звонил, но получил ту же ошибку. Я смог исправить свой клиент следующим образом.
-
В конфигурации настройте режим безопасности:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
-
В коде установите прокси-класс для разрешения олицетворения (я добавил ссылку на службу, называемую клиентом):
Customer_PortClient proxy = new Customer_PortClient();
proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
Ответ 2
У меня есть аналогичная проблема, вы пробовали:
proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
Ответ 3
Я вижу, что это еще не ответило, это точная цитата отсюда:
WSHttpBinding попытается выполнить внутреннее согласование на уровне SSP. Чтобы это было успешным, вам нужно разрешить анонимность в IIS для VDir. Затем WCF по умолчанию выполняет SPNEGO для учетных данных окна. Разрешение анонимности на уровне IIS не разрешает никому, он откладывает стек WCF.
Я нашел это через: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html
После googling: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous
Ответ 4
У меня была аналогичная проблема и я попробовал все, что было предложено выше. Затем я попытался изменить clientCreditialType на Basic, и все работало нормально.
<basicHttpBinding>
<binding name="BINDINGNAMEGOESHERE" >
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"></transport>
</security>
</binding>
</basicHttpBinding>
Ответ 5
Вот что мне нужно было сделать, чтобы это работало. Это означает:
- Пользовательский UserNamePasswordValidator (нет необходимости в учетной записи Windows, SQLServer или ActiveDirectory - ваш UserNamePasswordValidator может иметь жесткое кодирование имени пользователя и пароля или читать его из текстового файла, MySQL или любого другого).
- HTTPS
- IIS7
- .net 4.0
Мой сайт управляется через DotNetPanel. Он имеет 3 варианта безопасности для виртуальных каталогов:
- Разрешить анонимный доступ
- Включить базовую проверку подлинности
- Включить встроенную проверку подлинности Windows
Требуется только "Разрешить анонимный доступ" (хотя, этого было недостаточно).
Настройка
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
В моем случае не имело значения.
Однако использование этого связывания работало:
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Windows" />
<message clientCredentialType="UserName" />
</security>
Ответ 6
Еще одно возможное решение этой ошибки, которую я нашел. Возможно, не ответил на точный вопрос 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;
Ответ 7
Попробуйте указать имя пользователя и пароль для своего клиента, как показано ниже
client.ClientCredentials.UserName.UserName = @ "Domain\username";
client.ClientCredentials.UserName.Password = "password";
Ответ 8
Просто эта проблема возникла на машине разработки (производство работает просто отлично). Я изменяю свою конфигурацию в IIS, чтобы разрешить анонимный доступ, и поместил мое имя и пароль в качестве учетных данных.
Не лучший вариант, я уверен, но он работает для тестирования.
Ответ 9
У меня была такая же ошибка сегодня, после развертывания нашей службы, вызывающей внешнюю службу в промежуточную среду в лазурном режиме. Локальная служба называлась внешней службой без ошибок, но после ее развертывания она не выполнялась.
В конце концов оказалось, что внешняя служба имеет проверку IP. Новая среда в Azure имеет другой IP-адрес, и он был отклонен.
Итак, если вы когда-нибудь получите эту ошибку, вызовите внешние службы
Это может быть ограничение IP.