2010-07-14 54 views
2

我有一个小实用程序,它是一个SOAP WebService客户端。 SOAP代理从WSDL生成。它工作正常。如何使用SQUID代理验证.NET2 Webservice

现在客户想要使用SQUID代理,但拒绝认证我的SOAP客户端。

我已经尝试:

MyWebservice ws = new MyWebservice(); 
// set URL etc. 
// login for the actual service, this part works 
HeaderLogin hl = new HeaderLogin(); 
hl.username = svcLogin; 
hl.password = svcPassword; 
ws.HeaderLoginValue = hl; 

// setting up the Proxy of the Proxy 
//ws.Proxy = System.Net.WebRequest.GetSystemWebProxy(); 
ws.Proxy = System.Net.WebRequest.DefaultWebProxy; 

//ws.Proxy.Credentials = CredentialCache.DefaultCredentials;     
ws.Proxy.Credentials = new NetworkCredential(proxyUser, proxyPassword, proxyDomain); 

但我不断收到HTTP 407错误:要求代理身份验证。

SQUID(squid/2.7.STABLE4)设置为使用NTLM和AD进行身份验证。这似乎工作正常:有其他WebService客户端通过代理服务器正常。

我没有直接访问网站,但只有一些日志文件来看。最显着的是我可以在PCAP(Wireshark)文件中看到的东西。当我在PCAP创建以用户名=“汉克”一个的NetworkCredential,域名=“TEST”它显示为

... HTTP CONNECT someurl:443 HTTP/1.1 , NTLMSSP_AUTH, User: T\H

当我看PCAP为工作服务

... HTTP CONNECT someurl:443 HTTP/1.0 , NTLMSSP_AUTH, User: TEST\Henk

而且在SQUID acces.log所有尝试被示出为:

... 0 192.168.15.95 TCP_DENIED/407 1759 CONNECT someurl:443 - NONE/- text/html
... 32 192.168.15.95 TCP_DENIED/407 2055 CONNECT someurl:443 - NONE/- text/html
... 31 192.168.15.95 TCP_DENIED/407 1759 CONNECT someurl:443 - NONE/- text/html

混凝土问题:

  • .NET2 SOAP和Squid的任何已知问题?
  • 是TEST \ Henk显示T \ H显着吗?
  • 其他我应该找的东西?
+0

随意的事情来检查:哪里PROXYUSER,对proxyPassword和proxyDomain行是从哪里来的?在达到这一点之前是否有可能意外地错误? 'proxyUser = form.Fields [“ProxyUser”] [0]'而不是'proxyUser = form.Fields [“ProxyUser”]'也许? – Stobor 2010-07-22 07:44:47

+0

@Stobor:好点,但我会称之为'系统',而不是'随机'。全部检查并重新检查。 – 2010-07-22 08:30:39

+0

@亨克 - 你有没有解决这个问题?尽管所有浏览器都使用代理进行身份验证,但WebClient在禁用身份验证时仍然有效,但我仍然使用WebClient拒绝使用Squid代理进行身份验证。 – 2014-02-28 11:33:32

回答

2

T \ H可能表示您将Unicode字符串用作ASCII字符串。由于Unicode字符是两个字节(Windows上最常见的情况),因此如果将它们解释为ASCII,则会得到真实字符和空终止符字节。

我不希望在.NET应用程序中看到这种类型的错误,但你永远不知道。

+0

我会明天尝试,但我认为标题中有一个名为UnicodeNegotiate的标志。 T \ H的东西也可能来自WireShark。 – 2010-07-19 19:31:39

+0

你可以看看WireShark中的原始字节,它会告诉你它是WireShark还是只是数据的发送者。 – Nasko 2010-07-20 22:10:49

+0

我喜欢这个建议,你测试过Henk吗? – Segfault 2010-07-22 12:49:02

0

我看到鱿鱼日志显示访问被拒绝someurl:443 ...端口443是一个安全通道端口(SSL)。通常,SSL上托管的Web服务需要某种身份验证。请检查网络服务凭证要求。您可能必须通过证书或通过证书将自己认证为有效的客户端。

+0

ajay,你是对的,但我们有这一切(和工作)。这只是代理和407封锁我们的错误。 – 2010-07-22 06:42:34

+0

你可以尝试设置“http_access允许”到你的squid配置域 – 2010-07-22 07:07:32

4

有可能在连接完成之前NTLM连接正在被回收,导致新的/秒的匿名连接请求和407错误。

尝试覆盖GetWebRequest(Uri uri)方法并将KeepAlive属性设置为false。

编辑Reference.cs具有下列文件:

protected override WebRequest GetWebRequest(Uri uri) 
{ 
    HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri); 
    webRequest.KeepAlive = false; 
    return webRequest; 
} 

只记得更新Web引用将导致Visual Studio重新生成该文件,你会需要重新修改文件。

+0

我不能在下周之前测试它,但我想这不是问题,我可以在日志中看到其他(工作)客户端也使用KeepAlive = true。 – 2010-07-23 08:46:46

0

可以尝试添加“的http_access允许”域在你的鱿鱼配置