C#配置带用户名密码的公司代理连接外部IP报407认证失败问题求助
问题根因
你虽然为WebProxy对象配置了正确的凭证,但后续是通过原生Socket手动构造并发送CONNECT隧道请求,完全没有用到.NET内置的Web请求处理流程,因此你设置的凭证信息不会被自动注入到请求头中,代理端接收不到认证信息就会返回407错误。你之前使用的curl命令会自动把-U参数传入的凭证封装为请求头,所以可以正常工作。
修复方案
方案1:适配当前Socket实现,手动添加认证头
如果必须保留底层Socket操作的逻辑,直接手动构造代理认证头添加到CONNECT请求中即可,同时修正HTTP请求的格式问题:
// 构造BASIC认证信息 string authInfo = "MYUSERNAME:MYPASSWORD"; string base64Auth = Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo)); // 严格遵循HTTP规范使用\r\n作为换行符,补充必填的Host头和代理认证头 string proxyMsg = $"CONNECT {destIP}:{destPort} HTTP/1.1\r\n" + $"Host: {destIP}:{destPort}\r\n" + $"Proxy-Authorization: Basic {base64Auth}\r\n\r\n";
如果你的代理优先使用NTLM/NEGOTIATE认证,手动构造BASIC认证可能无法生效,推荐使用方案2。
方案2:改用HttpClient实现,复用内置代理处理逻辑
如果不需要直接操作底层Socket,使用.NET内置的HttpClient可以自动处理各类代理认证逻辑,代码更简洁稳定:
// 配置代理信息 var proxy = new WebProxy("http://MyComparyProxyAddress.com", 8080) { UseDefaultCredentials = false, Credentials = new NetworkCredential("MYUSERNAME", "MYPASSWORD") }; // 配置HttpClient处理器 var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true, // 如果目标地址是自签名证书,可按需开启下面的配置跳过证书校验 // ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true }; // 初始化客户端后直接调用目标地址即可 var client = new HttpClient(handler);
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

