You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 05:45:04