首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HttpClient将Windows身份验证传递给代理

使用HttpClient将Windows身份验证传递给代理
EN

Stack Overflow用户
提问于 2019-07-18 17:20:36
回答 1查看 1.8K关注 0票数 3

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

我得到了以下代码:

代码语言:javascript
运行
复制
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 error code 407。

我是不是漏掉了什么明显的东西?我知道关于这个话题有无数的问题,但似乎没有什么能解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2019-07-22 21:41:00

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

代码语言:javascript
运行
复制
var TARGETURL = "http://en.wikipedia.org/";

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

尝尝这个。

代码语言:javascript
运行
复制
handler.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
handler.Credentials = CredentialCache.DefaultNetworkCredentials;

好的,你的webserivces使用了windows身份验证。您的桌面客户端在您的凭据下工作,您需要模拟https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.impersonate?view=netframework-4.8

如果是基本身份验证,请选中此选项。

代码语言:javascript
运行
复制
HttpClient client = new HttpClient(handler);

            **var byteArray = Encoding.ASCII.GetBytes("username:password1234");**


**client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));**
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57091142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档