WCFTestClient HTTP-запрос не авторизован с помощью схемы аутентификации клиента "Anonymous".
Я создал один сервис WCF и развернул его на сервере. Когда я просматриваю этот сервис, он дает мне положительный ответ с? Wsdl URL. Сейчас я пытаюсь протестировать сервис через тестовый клиент WCF. Это показывает правильные метаданные. Но когда я пытаюсь вызвать какой-либо метод из сервиса, он показывает мне исключение... вот подробности ошибки с трассировкой стека...
HTTP-запрос не авторизован с помощью схемы аутентификации клиента "Anonymous". Заголовок аутентификации, полученный от сервера, был "Negotiate,NTLM".
Трассировка стека сервера:
в
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(запрос HttpWebRequest, ответ HttpWebResponse, WebException responseException, фабрика HttpChannelFactory)
HTTP-запрос не авторизован с помощью схемы аутентификации клиента "Anonymous". Заголовок аутентификации, полученный от сервера, был "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>
10 ответов
У меня не было контроля над конфигурацией безопасности для службы, в которую я звонил, но я получил ту же ошибку. Я смог исправить мой клиент следующим образом.
В конфиге установите режим безопасности:
<security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security>
В коде установите прокси-класс, чтобы разрешить олицетворение (я добавил ссылку на службу под названием customer):
Customer_PortClient proxy = new Customer_PortClient(); proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
У меня есть похожая проблема, вы пробовали:
proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
Еще одно возможное решение этой ошибки, которое я нашел. Возможно, не ответил на точный вопрос 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;
У меня была похожая проблема, и я попробовал все предложенное выше. Затем я попытался изменить clientCreditialType на Basic, и все работало нормально.
<basicHttpBinding>
<binding name="BINDINGNAMEGOESHERE" >
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"></transport>
</security>
</binding>
</basicHttpBinding>
Я вижу, что это еще не ответили, это точная цитата отсюда:
WSHttpBinding попытается выполнить внутреннее согласование на уровне SSP. Чтобы это было успешным, вам нужно разрешить анонимный доступ в IIS для VDir. Затем WCF по умолчанию будет выполнять SPNEGO для учетных данных окна. Разрешение анонимного доступа на уровне IIS не позволяет никому входить, оно откладывается в стек WCF.
Я нашел это через: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html
После поиска в Google: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous
Вот что я должен был сделать, чтобы это заработало. Это означает:
- Пользовательский 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>
У меня тоже была эта ошибка, и, наконец, эти коды сработали для меня в dot net core 3.1
сначала установите svcutil в командной строке: dotnet tool install --global dotnet-svcutil
Затем закройте командную строку и откройте ее снова.
Затем создайте Reference.cs в командной строке:
dotnet-svcutil http://YourService.com/SayHello.svc
(Требуется ключ ввода, имя пользователя и пароль)
Добавьте папку с именем Connected Services в корень проекта.
Скопируйте файл Reference.cs в папку Connected Services.
Добавьте эти 4 строки в Reference.cs после строк, в которых создается BasicHttpBinding и устанавливается MaxBufferSize:
result.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
result.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
result.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
result.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
Используйте эту службу в своем контроллере:
public async Task<string> Get()
{
try
{
var client = new EstelamClient();
client.ClientCredentials.UserName.UserName = "YourUserName";
client.ClientCredentials.UserName.Password = "YourPassword";
var res = await client.EmployeeCheckAsync("service parameters");
return res.ToString();
}
catch (Exception ex)
{
return ex.Message + " ************ stack : " + ex.StackTrace;
}
}
Не забудьте установить эти пакеты в csproj:
<PackageReference Include="System.ServiceModel.Duplex" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.Http" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.NetTcp" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.Security" Version="4.6.*" />
У меня была такая же ошибка сегодня, после развертывания нашего сервиса, вызывающего внешний сервис в промежуточной среде Azure. Локальная служба без ошибок вызвала внешнюю службу, но после развертывания - нет.
В конце концов оказалось, что внешний сервис имеет проверку IP. Новая среда в Azure имеет другой IP-адрес, и он был отклонен.
Так что, если вы когда-нибудь получите эту ошибку вызова внешних служб
Это может быть ограничение IP.
Попробуйте указать имя пользователя и пароль в вашем клиенте, как показано ниже
client.ClientCredentials.UserName.UserName = @"Домен \ имя пользователя"; client.ClientCredentials.UserName.Password = "пароль";
Только что получил эту проблему на машине разработки (производство работает просто отлично). Я изменяю свою конфигурацию в IIS, чтобы разрешить анонимный доступ, и ввел свои имя и пароль в качестве учетных данных
Не лучший способ, я уверен, но он работает для целей тестирования.