Проверка подлинности Windows работает с локального на сервер, но не с сервера на сервер

У меня есть два сайта, A а также B, A потребляет API, который B разоблачает и B требуется проверка подлинности Windows. Оба сайта живут в Домене D,

API используется через HttpClientи когда сайт A запускается локально, под моей учетной записью домена (которая находится в домене P), доступ предоставлен. В этом случае, HttpClient создается так:

using(var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials: true }))

когда A развернут на тестовом сервере, приведенные выше результаты в 401 Unauthorized ответ. Пул приложений на тестовом сервере выполняется под учетной записью службы в домене D,

При явном использовании этой учетной записи службы вот так:

var credential = new NetworkCredential("service-account", "password", "D");
var cache = new CredentialCache
{
  {
    new Uri(apiServerUri), "NTLM", credential
  }
};
var handler = new HttpClientHandler
{
  Credentials = cache
};

using(var client = new HttpClient(handler))
...

И снова работающий сайт A локально доступ по-прежнему предоставляется. Доступ также предоставляется при доступе к API напрямую через браузер и указании учетных данных учетной записи службы. Журналы указывают, что это определенно учетная запись службы, используемая для доступа к API.

Развертывание вышеуказанного на сервере тестирования все еще приводит к 401 Unauthorized,

Развертывание сайта A в локальный экземпляр IIS, также успешно использует API B,

Работающий сайт B локально, а затем доступ к нему через сайт A локально, приводит к 401 Unauthorized,

Доступ к API через браузер на сервере тестирования, где A и указывает учетные данные учетной записи службы, а также дает 401 Unauthorized,

Я не уверен, куда идти отсюда - я что-то упустил в коде, чтобы заставить это работать? Или это может быть проблема IIS или AD?

1 ответ

Решение

Хотя мне еще предстоит точно определить, почему это обходное решение работает, или есть ли лучший способ сделать это (потому что это кажется неуклюжим), следующее позволило A подключиться к B когда оба сидят на одном сервере.

сайт B имеет дополнительную настройку привязки хоста в IIS для прослушивания localhost:12345, сайт A был настроен для подключения к этой конечной точке, а не доменное имя для сайта B, Аутентификация теперь работает правильно.

Мне было бы интересно, если кто-нибудь может объяснить, почему это так - мне не нравятся "волшебные" исправления.

Похоже, что эта статья является вероятной причиной такого поведения. В частности:

При использовании полного доменного имени (FQDN) или настраиваемого заголовка узла для просмотра локального веб-сайта, размещенного на компьютере под управлением Microsoft Internet Information Services (IIS) 5.1 или более поздней версии, может появиться сообщение об ошибке напоминает следующее: HTTP 401.1 - неавторизован: сбой входа в систему Эта проблема возникает, когда веб-сайт использует встроенную аутентификацию и имеет имя, сопоставленное с локальным адресом обратной связи

а также

Поэтому проверка подлинности не выполняется, если полное доменное имя или пользовательский заголовок узла, который вы используете, не совпадает с именем локального компьютера.

Модификации реестра на этих серверах не подходят, поэтому похоже, что мы будем использовать обходной путь.

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