Базовая аутентификация 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 просто игнорирует эти настройки.

Решение.

  1. открыто %SolutionDir%\.vs\config\applicationhost.config в текстовом редакторе.
  2. Найти первым <authentication> тег.
  3. Под ним найди <basicAuthentication enabled="false" />и изменить enabled в true,
  4. Сохранить файл.
  5. Перезапустите веб-приложение.

Обратите внимание, что свойства, которые вы можете увидеть, нажав F4, хранятся в <location path="YourProjectName"> тег.

По умолчанию у него есть под-тег authentication, но без basicAuthentication:

<authentication>
    <windowsAuthentication enabled="false" />
    <anonymousAuthentication enabled="false" />
</authentication>

Если решение имеет более одного проекта, размещенного в IIS Express, с пользовательскими настройками аутентификации, следует добавить basicAuthentication в связанный с проектом раздел вместо первого <authentication> тег, который является глобальной конфигурацией для решения.

Я бы оставил комментарий, но моя репутация слишком низкая, в прошлом у меня возникала такая проблема, когда сервер отправлял обратно перенаправление http, а библиотека http автоматически отправляла мой запрос без пользовательских данных заголовка. Я думаю, что объект запроса или ответа будет иметь поле URI, если это произойдет, вы также можете отключить автоматическую обработку перенаправления. Я все выяснил, используя проволочную акулу, и я настоятельно рекомендую вам сделать это дальше.

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