Проверка подлинности 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 - неавторизован: сбой входа в систему Эта проблема возникает, когда веб-сайт использует встроенную аутентификацию и имеет имя, сопоставленное с локальным адресом обратной связи
а также
Поэтому проверка подлинности не выполняется, если полное доменное имя или пользовательский заголовок узла, который вы используете, не совпадает с именем локального компьютера.
Модификации реестра на этих серверах не подходят, поэтому похоже, что мы будем использовать обходной путь.