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 ответов

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

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

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

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

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

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

  1. Разрешить анонимный доступ
  2. Включить базовую аутентификацию
  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, чтобы разрешить анонимный доступ, и ввел свои имя и пароль в качестве учетных данных

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

Другие вопросы по тегам