.NET Core 8中Flurl默认代理未使用当前用户凭据问题
问题描述
我正在构建一个.NET Core 8应用,使用Flurl向REST API发送HTTP请求。手动配置带凭据的代理时请求正常,但依赖系统默认代理设置时,请求不会自动使用当前用户的凭据,抛出异常:代理隧道请求至代理'http://my-proxy:myport/'失败,状态码'407'。同一用户在命令行执行cURL却能正常访问目标API。
相关代码如下:
// 取消注释以下代码即可正常运行: //FlurlHttp.Clients.WithDefaults( builder => builder // .ConfigureInnerHandler( hch => { // hch.PreAuthenticate = true; // // 需要当前用户凭据: // hch.Proxy = new System.Net.WebProxy( "http://my-proxy:myport", true, null, new NetworkCredential( "mydomain\mylogin", "mypassword" ) ); // hch.UseProxy = true; // } ) ); var response = await "https://the-oauth-server/oauth/token" .PostUrlEncodedAsync( new { client_id = "my-client-id", client_secret = "my-client-secret", grant_type = "client_credentials", scope = "the-scope" } );
我尝试过以下两种方式但未解决问题:
- 设置代理为系统默认代理:
hch.Proxy = System.Net.WebRequest.GetSystemWebProxy(); - 设置凭据为默认凭据:
hch.Proxy.Credentials = CredentialCache.DefaultCredentials;
解决方案
在.NET Core环境中,CredentialCache.DefaultCredentials无法自动将NTLM/Kerberos凭据传递给代理,需要显式配置使用当前用户的默认网络凭据,同时确保代理配置逻辑完整。
修改Flurl的默认客户端配置,完整代码如下:
FlurlHttp.Clients.WithDefaults(builder => builder .ConfigureInnerHandler(hch => { hch.PreAuthenticate = true; // 获取系统默认代理配置 var systemProxy = System.Net.WebRequest.GetSystemWebProxy(); // 绑定当前用户的网络凭据到代理 systemProxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; hch.Proxy = systemProxy; hch.UseProxy = true; }) );
关键细节说明:
- 使用
DefaultNetworkCredentials:这个属性专门针对网络请求场景,能正确获取当前登录用户的Kerberos/NTLM凭据,适配代理的身份认证需求;而DefaultCredentials主要用于本地资源访问,不适合网络代理场景。 - 显式绑定凭据到系统代理:仅获取系统代理配置不够,必须手动将用户凭据绑定到代理对象,才能让Flurl底层的HttpClientHandler自动携带凭据发起请求,和cURL的行为保持一致。
- 开启
PreAuthenticate:让请求在首次连接时就发送凭据,避免代理返回407后再进行重试,提升请求的效率和稳定性。
内容的提问来源于stack exchange,提问作者Théo Uzan
相关产品推荐
相关产品推荐

