为了账号安全,请及时绑定邮箱和手机立即绑定

.NET Core 2.1 Web API Impersonation 在处理错误时导致

.NET Core 2.1 Web API Impersonation 在处理错误时导致

C#
白衣非少年 2021-11-07 19:41:02
我正在尝试在 .NET Core 2.1 Web-API 中进行模拟。所以这个 Web-API 使用 HttpClient 调用另一个 Web-API,我需要调用第一个的用户也是执行第二个的用户。同样的场景在另一个运行完整框架的 Web-API 中也可以使用这个调用:((WindowsIdentity)_httpContextAccessor.HttpContext.User.Identity).Impersonate()由于Impersonate()在 .NET Core 2.1 中不可用,我搜索了一些示例WindowsIdentity.RunImpersonated并尝试了与此类似的不同版本的代码:WindowsIdentity identity = (WindowsIdentity)m_contextAccessor.HttpContext.User.Identity;HttpClient client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true });await WindowsIdentity.RunImpersonated(identity.AccessToken, async () =>{    var request = new HttpRequestMessage(HttpMethod.Get, url);    var response = await client.SendAsync(request);});这会引发错误,client.SendAsync错误消息是这样的:在此调用仍在处理时调用了 WSALookupServiceEnd。调用已取消 ---> System.Net.Http.HttpRequestException堆栈跟踪的开始:在 System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancelationToken) --- 内部异常堆栈跟踪结束 --- 在 System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken)取消令牌) 在 System.Threading.Tasks.ValueTask`1.get_Result() 在 System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)有没有其他人看到过这个错误或对如何解决这个问题有任何见解?我尝试了不同版本的代码来RunImpersonated与HttpContext用户进行调用,但都导致了相同的错误。感谢您提供任何意见
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

从 .NET Core 2.1 开始,SocketsHttpHandler 类提供了更高级别的 HTTP 网络类(如 HttpClient)使用的实现。尝试禁用此功能并查看异常是否消失。


查看完整回答
反对 回复 2021-11-07
?
森栏

TA贡献1810条经验 获得超5个赞

尽管这个错误非常模糊,但我很确定这个问题与服务器拒绝连接到端点有关,或者它找不到端点。我的问题是网络服务器看不到端点 - 仅供参考,不要使用“localhost:xxxx”指向本地端口。相反,请在您的配置中使用服务器的完整 IP 地址。localhost 并不总是在本地 DNS 中解析。



查看完整回答
反对 回复 2021-11-07
?
青春有我

TA贡献1784条经验 获得超8个赞

await WindowsIdentity.RunImpersonated(identity.AccessToken, async () =>

{

    //this should give you the impersonated user

    var impersonatedUser = WindowsIdentity.GetCurrent().Name;


    var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true });

    var request = new HttpRequestMessage(HttpMethod.Get, url);

    var response = await client.SendAsync(request);

});


查看完整回答
反对 回复 2021-11-07
  • 3 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信