Базовая аутентификация HttpClient с использованием Web API завершается неудачно, а браузер работает как положено
Я тестирую свой собственный сервис веб-API, и после добавления
[Authorize(Roles = "MyRole")]
к контроллеру, все запросы сделаны HttpClient
не удается с "Несанкционированный" (401). Служба размещена в IIS Express с включенной аутентификацией Windows, как предлагается здесь.
Клиент отправляет соответствующий заголовок запроса:
var authHeaderParameter = Convert.ToBase64String(Encoding.ASCII.GetBytes("MyUser:MyPassword"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderParameter);
Тот же запрос (по крайней мере, тот же URI и учетные данные), сделанные из браузера, работает как положено и возвращает данные. Fiddler показывает, что браузер отправляет заголовок запроса "Proxy-Authorization" и не отправляет "Authorization".
Что я делаю неправильно? Как исправить запрос, используя HttpClient
?
UPD.
Это тоже не помогает:
var handler = new HttpClientHandler
{
UseProxy = false
};
var client = new HttpClient(handler, true)
{
BaseAddress = new Uri(baseAddress)
};
2 ответа
Ну, проблема была в настройках IIS Express.
Я опубликую этот ответ и добавлю в вопрос тег "VS 2015", потому что это может быть полезно.
Благодаря @swiley, WireShark и npcap (последнее необходимо для захвата трафика интерфейса обратной связи через WireShark).
Изучив заголовки ответов, которые были отправлены в веб-браузер, я обнаружил, что 401 ответ содержит Autorization: NTLM
заголовки. Поскольку браузер автоматически обрабатывает этот случай, он отправляет текущие учетные данные NTLM в последующих запросах и получает запрошенные данные. мой HttpClient
код не, и, на самом деле, не должен обрабатывать NTLM
,
Предпосылки.
Прежде всего, это VS 2015, и мой проект веб-API использует IIS Express для хостинга, который является настройкой по умолчанию. Не по умолчанию здесь я изменил порт на постоянное значение:
Во-вторых, IIS Express в VS 2015 сохраняет свою конфигурацию в %SolutionDir%\.vs\config\applicationhost.config
файл. Обратите внимание, что это было изменено по сравнению с предыдущими версиями.
Третий. Свойства проекта, доступные при нажатии клавиши F4, очень ограничены, и, фактически, вы просто изменяете applicationhost.config
сверху:
Четвертый, этот пост не помогает:
Чтобы включить обычную проверку подлинности с использованием IIS, установите для режима проверки подлинности "Windows" в файле Web.config проекта ASP.NET:
Хотя это будет работать со "зрелым" IIS, Visual Studio + IIS express просто игнорирует эти настройки.
Решение.
- открыто
%SolutionDir%\.vs\config\applicationhost.config
в текстовом редакторе. - Найти первым
<authentication>
тег. - Под ним найди
<basicAuthentication enabled="false" />
и изменитьenabled
вtrue
, - Сохранить файл.
- Перезапустите веб-приложение.
Обратите внимание, что свойства, которые вы можете увидеть, нажав F4, хранятся в <location path="YourProjectName">
тег.
По умолчанию у него есть под-тег authentication
, но без basicAuthentication
:
<authentication>
<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="false" />
</authentication>
Если решение имеет более одного проекта, размещенного в IIS Express, с пользовательскими настройками аутентификации, следует добавить basicAuthentication
в связанный с проектом раздел вместо первого <authentication>
тег, который является глобальной конфигурацией для решения.
Я бы оставил комментарий, но моя репутация слишком низкая, в прошлом у меня возникала такая проблема, когда сервер отправлял обратно перенаправление http, а библиотека http автоматически отправляла мой запрос без пользовательских данных заголовка. Я думаю, что объект запроса или ответа будет иметь поле URI, если это произойдет, вы также можете отключить автоматическую обработку перенаправления. Я все выяснил, используя проволочную акулу, и я настоятельно рекомендую вам сделать это дальше.