【发布时间】:2019-11-27 04:33:52
【问题描述】:
我正在尝试将 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。
我是否遗漏了一些明显的东西?我知道关于这个话题有无数的问题,但似乎没有什么能解决这个问题。
【问题讨论】:
-
这是 Web 应用程序还是客户端应用程序?如果是托管在 IIS 上的 Web 应用程序,应用程序池在哪个用户下运行?
-
这是一个在Windows 10下运行WinForms的客户端应用程序,不涉及IIS。
-
你的代理支持吗?隐式 Windows 凭据 (DefaultNetworkCredentials) 不是用户 + 密码。
-
凭据代表用户,但这并不意味着它们带有登录名或密码。一些凭据确实包含这些,但其他凭据不包含。看看这个:如果你想使用 Windows 身份验证,你的代理必须支持它。
-
谢谢,但我真的没有做太多 :-),事实上 你 如果你找到了让它工作的方法或找到解决方法,你只需回答自己
标签: c# proxy windows-authentication dotnet-httpclient