使用HttpClient

时间:2019-07-18 09:20:35

标签: c# proxy windows-authentication dotnet-httpclient

我试图将Windows身份验证传递给WebProxy,以便用户不必手动输入其登录数据。 用例是一个代理服务器,它根据LDAP / AD服务器检查身份验证,而用户则必须定期更改其密码。

我有以下代码:

private void button1_ClickAsync(object sender, EventArgs e) {
    Url = "http://local.adress/test";
    Execute();
}

private void button2_Click(object sender, EventArgs e) {
    Url = "https://maps.googleapis.com/maps/api/timezone/json";
    Execute();
}

private void Execute() {
    var handler = new HttpClientHandler();
    handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
    handler.UseDefaultCredentials = true;
    handler.UseProxy = true;
    handler.Proxy = WebRequest.DefaultWebProxy;
    handler.Proxy.Credentials = new NetworkCredential("mydomainuser", "mydomainpassword");
    //handler.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;

    var client = new HttpClient(handler);
    Task<string> response = TestConnection(client, Url);
}

private async Task<string> TestConnection(HttpClient client, string url) {
    try {
        using (HttpResponseMessage result = await client.GetAsync(url)) {
            string res = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
            Console.WriteLine("content: " + res);
            return result.ToString();
        }
    } catch (Exception e) {
        Console.WriteLine("error: " + e.Message);
        return e.ToString();
    }
}

手动定义凭据时(如Execute方法中所示),所有内容均按预期工作。我已经检查了代理日志文件,以确保请求确实通过代理转发。

由于我的目标是使用户不必输入可能定期更改的密码,所以我尝试通过CredentialCache.DefaultNetworkCredentials传递凭据(我也尝试过CredentialCache.DefaultCredentials)。在执行请求时,代理会记录DENIED,而我的客户端返回HTTP错误代码407。

我缺少明显的东西吗?我知道这个主题有很多问题,但是似乎没有什么可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

您必须在代码中定义代理和主要URL。

var TARGETURL = "http://en.wikipedia.org/";

HttpClientHandler handler = new HttpClientHandler()
{
    Proxy = new WebProxy("http://127.0.0.1:8888"),
    UseProxy = true,
};