更新:
如果你刚刚抵达这个问题,一般要旨是,我想作一个HttpWebRequest通过代理,并且我得到一个407从我们的奇怪的代理服务器。即火狐,铬的所有管理进行谈判代理的成功,因为这样做Adobe空应用程序。它可能是重要的,谷歌铬网安装的实际失败,并且我们必须使用脱机的安装。

感谢伊恩的链接我已经有了它获得通过,下一个阶段。它是现在发送一个令回到代理,但是第3阶段是没有得到通过,因此请求与username/password hash不被发送。净,因此没有HTML返回。

我是使用:

  • IE6user-agent
  • Windows7
  • Scansafe代理
  • .净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 跟踪输出

即成功谈判的代理

该解决方案

我还没真正找到一个解决方案,但由于Feroze和埃里克我已经找到一个解决方法和发现的实际代理的(而不是它的结构)是主要的问题。它可以是一个模糊的问题,有3个变量:.净HttpWebRequest的执行情况,Windows7和Scansafe硬件的客户,坐在我们的架;但没有一个MSDN请求支持我不找出来。

有帮助吗?

解决方案

如果你想要设置证书的代理,你不应该设置凭据的请求。代理对象,而不是在请求对象?

http://msdn.microsoft.com/en-us/library/system.net.webproxy.credentials.aspx

此外,请记住,你需要制作一个HTTP/1.1request(或从技术上讲,任何请求与Keep-Alive)成功地使用NTLM/协商的认证。

(小提琴手的"授权"检查员将分解NTLM认证blob你,如果你还没看呢。)

其他提示

我写了一个实用工具,用于解码的NTLM blob发送在即,并HttpWebRequest会议。

当我看HttpWebRequest和即,它们都请求56bit和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

这里是转储即:

==== 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&128位安全。然而,对于windows7中,128位的安全NTLM已作出的默认,如果做不到这一点,认证将失败。正如你可以看到服务器的响应,服务器只是支持64位加密。

下面的链接,有一个讨论一个类似的问题所遇到的另一个人。http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/f68e8878-53e9-4208-b589-9dbedf851198

原因,即工作,而不是管理应用程序,为,即实际上并不要求NTLMSSP_NEGOTIATE_SEAL|NTLMSSP_NEGOTIATE_SIGN,其最终需要加密。然而,HttpWebRequest不请求这两个密封|标志。这需要128位密,而该方式即初始化NTLMSSP(没有密封和登录),则不需要加密。因此,即工作,而HttpWebRequest不。(请参阅上面的链接)

我认为,如果你改变你的安全政策以允许64位加密NTLM,你的代码的应用程序托管会的工作。或交替,要求代理供应商,以支持128位密为NTLM。

希望这会有所帮助。

验证中的如下设置 secpol.msc.它固定我们的问题。

Local Security Policy 
    Local Policies
        Security Options
            Network security: Minimum session security

设置为:

require 128 only for client. 

enter image description here

你可以试试设置的用户代理的头上你的HttpWebRequest,以同样的价值,IE8是设置?

有时,服务器不会挑战正确,如果用户代理不是他们的期望。

希望这会有所帮助。

是这样的代理分配?

proxy.Credentials = CredentialCache.DefaultCredentials;

当我最后一次使用代理与HttpWebRequest它分配像这样:

指定代理的请求:

request.Proxy.Credentials = Credentials.GetProxyCredentials();

通话的方法:

    public static ICredentials GetProxyCredentials()
    {
        return new NetworkCredential(AppConstants.Proxy_username, AppConstants.Proxy_password);
    }

配置的代理在网。config

<system.net>
  <defaultProxy enabled="true">
    <proxy
      autoDetect="False"
      bypassonlocal="True"
      scriptLocation="http://www.proxy.pac"
      proxyaddress="http://proxy1.blah.com" />
  </defaultProxy>
</system.net>

它可能是关于什么是你的"CredentialCache".试试这个代替:

proxy.Credentials = new NetworkCredential("username", "pwd", "domain"); 

这个怎么样:

        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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top