407认证要求-没有挑战的发送
-
22-07-2019 - |
题
更新:
如果你刚刚抵达这个问题,一般要旨是,我想作一个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.
你可以试试设置的用户代理的头上你的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();