407需要验证 - 没有发送的质询(407 Authentication required - no

2019-07-18 11:37发布

更新:
如果你刚刚来到这个问题,一般的要点是,我试图通过代理做一个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成功地谈判代理

  • Fidder酒店输出

解决方案

我还没有真正找到一个解决方案,但由于费罗兹和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