У нас есть 2 приложения - здесь я назову их API
и Consumer
.
Мне нужно получить от API
данные, относящиеся к текущему зарегистрированному пользователю Windows, поэтому я передаю аутентифицированному в настоящее время пользователю Windows от Consumer
до API
, используя HttpClientHandler при выполнении запроса :
public async Task<string> GetWindowsUserDataFromLegacyBackend()
{
var res = string.Empty;
HttpClientHandler authHandler = new HttpClientHandler
{
Credentials = CredentialCache.DefaultNetworkCredentials
};
using (HttpClient client = new HttpClient(authHandler))
{
try
{
HttpResponseMessage message = client.GetAsync(this._configuration.GetSection("Backend").Value + "Account/GetCurrentUser").Result;
if (message.IsSuccessStatusCode)
{
res = await message.Content.ReadAsStringAsync();
}
}
catch
{
}
}
return res;
}
Когда я запускаю Consumer
на localhost
и передаю аутентифицированного пользователя Windows на API
, который расположен на remote server
, я получаю правильный ответ от API
с данными, относящимися к пользователю.
Однако, когда я запускаю Consumer
с сервера и передаю аутентифицированному в настоящее время пользователю Windows на API
(который расположен на другом сервере), я не получать данные, связанные с пользователем. Похоже, что в этом случае аутентифицированный в настоящее время пользователь Windows неправильно отправляется Consumer
или неправильно читается 'API'.
Это то, что я использую в файле web.config:
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
Кроме того, когда я отслеживаю http-отклик с помощью fiddler, я сначала получаю ответ 401, затем снова 401, а затем ответ 200, именно так, как ожидается:
http://www.scip.be/index.php?Page=ArticlesNET38&Lang=EN
"На сервер поступает 3 вызова, и только последний возвращает код состояния 200 и ожидаемые данные. Windows Интегрированная аутентификация (WIA) использует согласование / Kerberos или NTLM аутентифицировать пользователей на основе зашифрованного билета, который отправляется между клиентом и сервером. Первоначальный запрос не включает авторизацию, поэтому он является анонимным. Затем IIS (Express) вернет сообщение 401 (неавторизованное) вместе со списком протоколы аутентификации, которые поддерживает сервер (IIS). В этом случае это Negotiate en NTLM. Затем браузер считывает поддерживаемые провайдеры аутентификации, он Если вы используете провайдера аутентификации Negotiate и отправляете зашифрованный билет безопасности в Active Directory, он вернет маркер Kerberos. Наконец этот Kerberos будет отправлен обратно в IIS. Если IIS сможет подтвердить его подлинность, он вернет сообщение 200 вместе с вашими данными. "
Это заставляет меня поверить, что API
получает правильного и существующего Windows пользователя (но не уверен в это).
Кто-нибудь с предложениями? Спасибо.