WindowsIdentity.RunImpersonated вызывает System. Net .Http.HttpRequestException для ASP. NET Core 3.1 - PullRequest
2 голосов
/ 04 февраля 2020

В настоящее время мы размещаем веб-приложение. net core 3.1 в IIS (сервер DEV), и оно использует Windows Аутентификацию. Мы хотим олицетворять учетные данные вызывающего абонента, когда мы вызываем другой webapi в одном из действий контроллера, вот наш код

        [Authorize]
        public IActionResult Get()
        {
            _logger.LogInformation("Boom! In Get");

            WindowsIdentity.RunImpersonated(((WindowsIdentity)HttpContext.User.Identity).AccessToken, () =>
            {
                _logger.LogInformation($"Received request");

                HttpClient _client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true })
                {
                    BaseAddress = new Uri("http://SomeTestUrl.com/")
                };

                var result = _client.GetAsync("/api/program").Result;
                var json = result.Content.ReadAsStringAsync().Result;


                _logger.LogInformation($"Returning response");
            });

            return Ok("True");
        }

Он отлично работает на моей локальной машине с IIS Express, но не работает на сервере DEV. Я получаю ниже ошибки.

Есть идеи, почему я получаю эту ошибку? Как правильно олицетворять пользователя в действии контроллера?

Другие наблюдения:

  • У нас есть еще один. net web api (не core), который вызывает тот же URL "http://SomeTestUrl.com/" в олицетворенном режиме, и он также работает нормально на сервере DEV.

  • Если я пытаюсь вызвать URL с IP-адресом "http://10.10.20.300/" вместо "http://SomeTestUrl.com/ "это работает.

Система. Net .Http.HttpRequestException: Обычно это временная ошибка при разрешении имени хоста и означает, что локальный сервер сделал не получить ответ от авторитетного сервера. ---> System. Net .Sockets.SocketException (11002): Обычно это временная ошибка при разрешении имени хоста и означает, что локальный сервер не получил ответ от авторитетного сервера. в System. Net .Http.ConnectHelper.ConnectAsyn c (Строковый хост, порт Int32, CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений --- в System. Net .Http.ConnectHelper.ConnectAsyn c (Строковый хост, порт Int32, CancellationToken cancellationToken) в System. Net .Http.HttpConnectionPool.ConnectAsyn c (запрос HttpRequestMessage, логическое значение allowHttp2, CancellationToken cancellationToken) в System. Net. 1045 * (запрос HttpRequestMessage, CancellationToken cancellationToken) в системе. Net .Http.HttpConnectionPool.GetHttpConnectionAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в запросе на возврат *. * * * * * Boolean doRequestAuth, CancellationToken cancellationToken) в System. Net .Http.AuthenticationHelper.SendWithAuthAsyn c (запрос HttpRequestMessage, Uri authUri, учетные данные ICredentials, логический preAuthenticat) Например, Boolean isProxyAuth, логическое значение doRequestAuth, пул HttpConnectionPool, CancellationToken cancellationToken) в System. Net .Http.RedirectHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken * 1995). * (Запрос HttpRequestMessage, CancellationToken cancellationToken) в системе. Net .Http.HttpClient.FinishSendAsyncBuffered (Task`1 sendTask, запрос HttpRequestMessage, CancellationTokenSource cts, логические значения disposeCts) * 10 * 30 * 10

1 Ответ

1 голос
/ 10 февраля 2020

Мы столкнулись с точно такой же проблемой, и нам пришлось прибегнуть к использованию IP-адреса обратной связи, чтобы избежать необходимости разрешения DNS (http://127.0.0.1/MyAddress). Многие часы были потрачены на попытки решить эту проблему без какой-либо радости, и я могу только предположить, что это ошибка в ядре. net. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...