HTTP Post and Put возвращает 401 Несанкционированный на определенных рабочих станциях при аутентификации с использованием Negotiate для интегрированной аутентификации Windows IIS
У нас странное поведение на небольшом количестве рабочих станций (Windows 7). Наш клиент.NET взаимодействует со службой REST Api (Web API 2), которая размещена в IIS. Клиент использует System.Net.Http.HttpClient для доступа к API и предназначен для.NET Framework 4.5.2. Api настроен на использование встроенной аутентификации Windows (Negotiate, NTLM).
Когда клиент вызывает Api, используя HTTP GET/DELETE, все работает. Когда клиент вызывает Api, используя HTTP POST/PUT (данные отправляются через тело запроса). IIS отвечает 401 Несанкционированным.
Эта проблема исчезает:
- при запуске прокси-сервера Fiddler на клиентской рабочей станции.
- Аутентификация IIS настроена на использование только NTLM
Я просмотрел множество постов и статей в блогах, но не нашел решения.
- Fiddler исправляет мое приложение http://www.telerik.com/blogs/help!-running-fiddler-fixes-my-app-
- Устраните неполадки проверки подлинности Kerberos https://blogs.msdn.microsoft.com/friis/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iisie/
SignalR показывает то же странное поведение. Клиент также связывается с сервисом, используя SignalR. Клиент может подключиться к концентратору и получать сообщения. Но получает 401 при попытке вызвать метод (вызов signalR выполняется с помощью POST). Поскольку клиент работает на Windows 7, он не поддерживает WebSockets. Одинаковое поведение на обоих транспорте (отправленные сервером события, длинный опрос). Это поведение аналогично тому, что SignalR net45 дает 401 Несанкционированный на определенных комбинациях пользователь / машина. Также исправление (использование Microsoft.AspNet.SignalR.Client.2.2.0 \ lib \ net40 \ Microsoft.AspNet.SignalR.Client.dll) из этого поста также работает для SignalR.
Изменить: SignalR net40 не использует HttpClient из System.Net.Http. Поэтому ошибка должна быть связана с библиотекой System.Net.Http.
Большое спасибо за любые предложения.
1 ответ
Возможные обходные пути:
- Задавать
System.Net.ServicePointManager.Expect100Continue = false;
перед созданием любого экземпляра HttpClient Отключить это 100Продолжить на HttpClient
var c = new HttpClient(); c.DefaultRequestHeaders.ExpectContinue = false;