Несколько дней назад у меня была довольно сильная головная боль при проблемах с проверкой подлинности при использовании проверки подлинности Windows между клиентом и веб-службой wcf. Ошибка, которую я получал: "HTTP-запрос неавторизован с помощью схемы проверки подлинности клиента" Negotiate ". Заголовок аутентификации, полученный с сервера, был" NTLM ". Ни одно из решений в стеке не работало, потому что большинство из них были связаны со старыми методами.
HTTP-запрос неавторизован с помощью схемы аутентификации клиента "Negotiate". Заголовок аутентификации, полученный с сервера, был "NTLM",
Ответ 1
ОТВЕТ: Проблема заключалась в том, что все сообщения для такой проблемы были связаны с более старыми проблемами кебероса и IIS, в которых помогали полномочия прокси-сервера или свойства AllowNTLM. У меня было другое дело. То, что я обнаружил после нескольких часов сбора червей с земли, заключалось в том, что в некоторых установках IIS не включен Поставщик переговоров в списке поставщиков служб проверки подлинности IIS Windows. Поэтому я должен был добавить его и двигаться вверх. Мой сервис WCF начал аутентифицироваться, как ожидалось. Вот скриншот, как он должен выглядеть, если вы используете проверку подлинности Windows с анонимной авторизацией OFF.
Вам нужно щелкнуть правой кнопкой мыши по проверке подлинности Windows и выбрать пункт меню поставщика.
Надеюсь, это поможет сэкономить некоторое время.
Ответ 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... → конкретный пользователь
Ответ 6
Решение для меня состояло в том, чтобы установить AppPool с помощью AppPoolIdentity на идентификатор NetworkService.