Подтвердить что ты не робот

HTTP-запрос неавторизован с помощью схемы аутентификации клиента "Negotiate". Заголовок аутентификации, полученный с сервера, был "NTLM",

Несколько дней назад у меня была довольно сильная головная боль при проблемах с проверкой подлинности при использовании проверки подлинности Windows между клиентом и веб-службой wcf. Ошибка, которую я получал: "HTTP-запрос неавторизован с помощью схемы проверки подлинности клиента" Negotiate ". Заголовок аутентификации, полученный с сервера, был" NTLM ". Ни одно из решений в стеке не работало, потому что большинство из них были связаны со старыми методами.

4b9b3361

Ответ 1

ОТВЕТ: Проблема заключалась в том, что все сообщения для такой проблемы были связаны с более старыми проблемами кебероса и IIS, в которых помогали полномочия прокси-сервера или свойства AllowNTLM. У меня было другое дело. То, что я обнаружил после нескольких часов сбора червей с земли, заключалось в том, что в некоторых установках IIS не включен Поставщик переговоров в списке поставщиков служб проверки подлинности IIS Windows. Поэтому я должен был добавить его и двигаться вверх. Мой сервис WCF начал аутентифицироваться, как ожидалось. Вот скриншот, как он должен выглядеть, если вы используете проверку подлинности Windows с анонимной авторизацией OFF.

Вам нужно щелкнуть правой кнопкой мыши по проверке подлинности Windows и выбрать пункт меню поставщика.

enter image description here

Надеюсь, это поможет сэкономить некоторое время.

Ответ 2

Я обновил свою старую версию WCF до WCF 4 с нижеследующими изменениями, надеюсь, вы также можете сделать аналогичные изменения.

1. Web.config:

<system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="Demo_BasicHttp">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="InheritedFromHost"/>
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>
      <services>
        <service name="DemoServices.CalculatorService.ServiceImplementation.CalculatorService" behaviorConfiguration="Demo_ServiceBehavior">
          <endpoint address="" binding="basicHttpBinding"
              bindingConfiguration="Demo_BasicHttp" contract="DemoServices.CalculatorService.ServiceContracts.ICalculatorServiceContract">
            <identity>
              <dns value="localhost"/>
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="Demo_ServiceBehavior">
            <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <protocolMapping>
        <add scheme="http" binding="basicHttpBinding" bindingConfiguration="Demo_BasicHttp"/>
      </protocolMapping>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

2. App.config:

    <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ICalculatorServiceContract" maxBufferSize="2147483647" maxBufferPoolSize="33554432" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="4096" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:24357/CalculatorService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICalculatorServiceContract" contract="ICalculatorServiceContract" name="Demo_BasicHttp" />
    </client>
  </system.serviceModel>

Ответ 3

Для меня решение было помимо использования "Ntlm" в качестве типа учетных данных:

    XxxSoapClient xxxClient = new XxxSoapClient();
    ApplyCredentials(userName, password, xxxClient.ClientCredentials);

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials)
    {
        clientCredentials.UserName.UserName = userName;
        clientCredentials.UserName.Password = password;
        clientCredentials.Windows.ClientCredential.UserName = userName;
        clientCredentials.Windows.ClientCredential.Password = password;
        clientCredentials.Windows.AllowNtlm = true;
        clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    }  

Ответ 4

Не эта точная проблема, но это лучший результат, когда googling для почти точно такой же ошибки:

Если вы видите эту проблему при вызове службы WCF, размещенной на том же компьютере, вам может потребоваться заполнить раздел реестра BackConnectionHostNames

  • В regedit найдите и выберите следующий подраздел реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  • Щелкните правой кнопкой мыши MSV1_0, выберите "Создать" и затем Multi-String Value.
  • В столбце Имя введите BackConnectionHostNames и нажмите клавишу ВВОД.
  • Щелкните правой кнопкой мыши BackConnectionHostNames и выберите "Изменить". В поле "Значение" введите CNAME или псевдоним DNS, который используется для локальных общих ресурсов на компьютере, и нажмите "ОК".
    • Введите имя каждого узла в отдельной строке.

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

Ответ 5

У меня была такая же проблема, для ее решения установить конкретного пользователя из домена в iis → action sidebar-> Basic Settings → Connect as... → конкретный пользователь

enter image description here

Ответ 6

Решение для меня состояло в том, чтобы установить AppPool с помощью AppPoolIdentity на идентификатор NetworkService.