更新:
如果你刚刚来到这个问题,一般的要点是,我试图通过代理做一个HttpWebRequest的,而且我从我们奇怪的代理服务器得到一个407。 IE,火狐,Chrome都设法成功地洽谈代理,因为这样做Adobe AIR应用程序。 这可能是重要的,谷歌Chrome网络安装实际上失败,我们必须使用离线安装。
感谢Ian的链接我找到了打通到下一个阶段。 它现在发送令牌回代理,然而第三阶段是没有得到通过,所以用的用户名/密码哈希请求没有被.NET,因此没有返回HTML格式发送。
我在用:
- IE6用户代理
- Windows 7的
- ScanSafe的代理
- .NET 3.5
下面是等同于下面的日志最新的代码:
HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
IWebProxy proxy = request.Proxy;
// Print the Proxy Url to the console.
if (proxy != null)
{
// Use the default credentials of the logged on user.
proxy.Credentials = CredentialCache.DefaultCredentials;
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Accept = "*/*";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();
唯一的例外
引发WebException(407)认证要求。
正在使用的代理服务器
代理客户端是ScanSafe的在我们的服务器机房,这(曾经与NTLM身份验证),然后指引你的HTTP流量的服务器的流量进行过滤硬件设备。
的System.Net跟踪输出
IE成功地谈判代理
解决方案
我还没有真正找到一个解决方案,但由于费罗兹和Eric我已经找到了解决方法,发现实际的代理(而不是它的配置)是主要问题。 这可能是3个变量一个不起眼的问题:.NET的HttpWebRequest的实现,Windows 7和当然,在我们的架坐在ScanSafe的硬件客户端; 但没有MSDN支持请求我不会发现。
Answer 1:
如果要设置凭据的代理,你不应该在request.Proxy对象,而不是请求对象上设置的凭据?
http://msdn.microsoft.com/en-us/library/system.net.webproxy.credentials.aspx
另外,请记住,你必须做出的HTTP / 1.1请求(或技术上,与保活的任何请求)成功地使用NTLM /协商身份验证。
(提琴手的“验证”检验员会分解NTLM身份验证的斑点你,如果你还没有采取看看那个呢。)
Answer 2:
我写了一个实用程序来进行解码,在IE和HttpWebRequest的会议已发送的NTLM斑点。
当我看着HttpWebRequest和IE浏览器,他们都从服务器请求,56位和128位加密。 下面是使用该会话的转储的HttpWebRequest
==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: E20882B7
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
RESERVED2
RESERVED3
RESERVED4
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLM_NEGOTIATE_OEM
NTLMSSP_NEGOTIATE_UNICODE)
Domain :
Workstation:
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA
下面是从IE转储:
==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: A208B207
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
NTLMSSP_TARGET_TYPE_SHARE
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLMSSP_NEGOTIATE_UNICODE)
Domain : XXXX.UK
Workstation: XXX-X31
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA
在IE / HttpWebRequest的,它们都要求64 128bit的安全性。 然而,针对windows7,对于NTLM 128位的安全性已经成为默认的,并且没有,身份验证将失败。 你可以从服务器响应看到,服务器只支持64位加密。
下面的链接有另一人遇到了类似的问题的讨论。 http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/f68e8878-53e9-4208-b589-9dbedf851198
IE浏览器的工作原理,而不是管理应用,究其原因,是IE实际上并不要求NTLMSSP_NEGOTIATE_SEAL | NTLMSSP_NEGOTIATE_SIGN,其最终需要加密。 但是,HttpWebRequest的要求做两密封|注册。 这需要128位加密,而IE浏览器的方式初始化NTLMSSP(不SEAL&SIGN),它不需要加密。 因此IE工程,而HttpWebRequest的没有。 (见上面的链接)
我认为,如果你改变你的安全策略来允许NTLM 64位加密,您的托管代码应用程序将正常工作。 或者交替,要求代理销售商,以支持128位加密NTLM。
希望这可以帮助。
Answer 3:
我有一个类似的问题和所使用的技巧在下面的博客文章来解决问题:
http://blogs.msdn.com/jpsanders/archive/2009/03/24/httpwebrequest-webexcepton-the-remote-server-returned-an-error-407-proxy-authentication-required.aspx
Answer 4:
验证以下设置secpol.msc
。 它固定我们的问题。
Local Security Policy
Local Policies
Security Options
Network security: Minimum session security
调成:
require 128 only for client.
Answer 5:
你可以尝试设置User-Agent头在你的HttpWebRequest,相同的值IE8的设置?
有时,服务器将无法正常如果用户代理是他们所期望不算什么挑战。
希望这可以帮助。
Answer 6:
它是代理分配的方式吗?
proxy.Credentials = CredentialCache.DefaultCredentials;
当我最后一次使用代理与HttpWebRequest的它是这样分配:
指定代理请求:
request.Proxy.Credentials = Credentials.GetProxyCredentials();
调用方法:
public static ICredentials GetProxyCredentials()
{
return new NetworkCredential(AppConstants.Proxy_username, AppConstants.Proxy_password);
}
配置在web.config中代理
<system.net>
<defaultProxy enabled="true">
<proxy
autoDetect="False"
bypassonlocal="True"
scriptLocation="http://www.proxy.pac"
proxyaddress="http://proxy1.blah.com" />
</defaultProxy>
</system.net>
Answer 7:
它可能与什么是你“CredentialCache”。 试试这个:
proxy.Credentials = new NetworkCredential("username", "pwd", "domain");
Answer 8:
这个怎么样:
HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
WebProxy proxyObject = new System.Net.WebProxy("http://10.0.0.1:8080/", true); //whatever your proxy address is
proxyObject.Credentials = CredentialCache.DefaultCredentials;
request.Proxy = proxyObject;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Accept = "*/*";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();
文章来源: 407 Authentication required - no challenge sent