【问题标题】:WindowsIdentity.RunImpersonated causes System.Net.Http.HttpRequestException on ASP.NET Core 3.1WindowsIdentity.RunImpersonated 导致 ASP.NET Core 3.1 上的 System.Net.Http.HttpRequestException
【发布时间】:2020-05-19 16:14:23
【问题描述】:

目前,我们在 IIS(DEV 服务器)中托管一个 .net core 3.1 webapp,它使用 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");
        }

它在我的本地机器上运行良好,但在 DEV 服务器上却失败了。我得到以下错误。

知道为什么会出现此错误吗?在控制器操作中模拟用户的正确方法是什么?

其他观察:

System.Net.Http.HttpRequestException:这通常是临时的 主机名解析期间的错误,意味着本地服务器确实 没有收到来自权威服务器的响应。 ---> System.Net.Sockets.SocketException (11002):这通常是主机名解析期间的临时错误,意味着 本地服务器未收到权威机构的响应 服务器。 在 System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32 端口, CancellationToken 取消令牌) --- 内部异常堆栈跟踪结束 --- 在 System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32 端口, CancellationToken 取消令牌) 在 System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage 请求,布尔 allowHttp2,CancellationToken 取消令牌) 在 System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage 请求,CancellationToken 取消令牌) 在 System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage 请求,CancellationToken 取消令牌) 在 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancelToken) 在 System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage 请求,Uri authUri,ICredentials 凭据,布尔值 preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool 池,CancellationToken cancelToken) 在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage 请求, CancellationToken 取消令牌) 在 System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌) 在 System.Net.Http.HttpClient.FinishSendAsyncBuffered(任务`1 sendTask, HttpRequestMessage 请求,CancellationTokenSource cts,布尔值 处置)

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-core .net-core-3.1


    【解决方案1】:

    我们遇到了完全相同的问题,不得不求助于使用环回 IP 地址以避免需要 DNS 解析 (http://127.0.0.1/MyAddress)。已经投入了很多时间来尝试解决这个问题而没有任何乐趣,我只能假设这是 .net 核心中的一个错误。我希望这有帮助。

    【讨论】:

    • 正如我提到的 ip 地址,它可以工作。你知道用 ip 地址而不是 DNS 名称访问 api 端点的利弊吗?
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多