HttpClient .NET WebApi не отправляет учетные данные проверки подлинности Windows в один и тот же домен

Я использую несколько API-интерфейсов интрасети, чтобы попытаться создать некоторые приложения, в которых есть некоторые службы, общие для всех приложений. Многие из этих сервисов могут быть вызваны напрямую из графического интерфейса пользователя с использованием запросов Javascript, однако пара сервисов должна вызываться другими серверными приложениями.

Все внешние интерфейсы и API-интерфейсы используют проверку подлинности Windows. Сейчас у меня есть возможность авторизовать любого пользователя, прошедшего проверку подлинности Windows. Анонимная аутентификация отключена.

Я использую HttpClient для подключения к необходимому сервису из веб-кода. Вот пример:

HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["OtherServiceUrl"]);

client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));

SomeResponseObject responseObject;
HttpResponseMessage response = client.GetAsync("SomeController").Result;
if (response.IsSuccessStatusCode)
{
    responseObject = response.Content.ReadAsAsync<SomeResponseObject>().Result;
}
else
{
    throw new ApplicationException("API request not successful");
}

Хорошая новость заключается в том, что это работает нормально, когда я запускаю сервисы локально Плохая новость заключается в том, что при развертывании в IIS происходит сбой вызова веб-службы с несанкционированным ответом.

После долгих раздумий я понял, что единственный раз, когда я получаю несанкционированный ответ, это когда домен целевого API совпадает с доменом вызывающего приложения. Это работало на моем локальном компьютере, потому что IIS Express назначает новый порт каждому приложению. Ситуация с соответствующим доменом возникла в IIS, поскольку я создал вызывающее приложение и API как приложения на одном сайте в IIS, поэтому эти два приложения выглядят как каталоги в одном домене. Похоже, что HttpClient не потрудится отправить аутентификацию из вызывающего веб-приложения, если обнаружит, что домены совпадают.

Я создал новый сайт на том же сервере, но привязал его к другому порту, вместо этого поместил туда API и попытался снова. Конечно, это решает проблему, запрос от API проходит просто отлично.

Я могу поместить несколько поддоменов для обработки всех этих разных сервисов или просто использовать разные порты, чтобы сделать домены для этих сервисов уникальными, но мне кажется странным, что это ограничение на месте , Кто-нибудь знает, есть ли свойство, которое я могу установить в обработчике или клиенте, или что-то еще, что я могу сделать, чтобы приложения, работающие на одном сайте IIS, могли общаться друг с другом через HttpClient, когда используется проверка подлинности Windows?

Спасибо!

Согласно предложению Сачина, я также попытался добавить это в веб-конфигурацию приложения, которое отправляет запрос API через HttpClient:

<system.net>
  <defaultProxy useDefaultCredentials="true" />
</system.net>

Все еще не повезло.

7 голосов | спросил GuessAgainMatt 23 PM00000060000004231 2016, 18:40:42

1 ответ


0

Ознакомьтесь с этим: https://support.microsoft.com/en- нас /кб /926642

В моем случае это был идентичный сценарий на Windows Server 2012, но решение в КБ по-прежнему применимо. Проверка по шлейфу предотвратит отправку учетных данных через httpClient, когда они находятся на одном хосте, что вызывает 401. Для меня единственным разрешением был метод 2 - установка DisableLoopbackCheck в реестре. Я понимаю, что это «функция» безопасности, но она, безусловно, препятствует использованию современной сервис-ориентированной архитектуры в классической среде Windows.

ответил brian_gtr 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 09 Sep 2016 22:08:25 +0300 2016, 22:08:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132