【发布时间】: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 服务器上却失败了。我得到以下错误。
知道为什么会出现此错误吗?在控制器操作中模拟用户的正确方法是什么?
其他观察:
我们有另一个调用相同 url 的 .net web api(不是核心) 模拟模式下的“http://SomeTestUrl.com/”也可以正常工作 在 DEV 服务器上很好。
如果我尝试使用 IP 地址“http://10.10.20.300/”而不是“http://SomeTestUrl.com/”调用 url,它会起作用。
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