C#HTTPWebRequest针对与领域网站协商/基本
很抱歉,我又问了一个关于这个话题的问题,但我一直在阅读,不能让它真正起作用 开门见山。。。我有一个链接可以下载zip文件。我已经被允许访问这个网站(我的用户),现在我正在尝试编写一个程序,每隔一段时间获取zip.file,这样我就可以处理它的数据了 当我尝试下载需要验证的代码时(见下面的代码),我得到了一个HTTP401。我想知道为什么,因为我的证件还可以,而且我可以使用浏览器获取文件C#HTTPWebRequest针对与领域网站协商/基本,c#,authentication,httprequest,basic-authentication,negotiate,C#,Authentication,Httprequest,Basic Authentication,Negotiate,很抱歉,我又问了一个关于这个话题的问题,但我一直在阅读,不能让它真正起作用 开门见山。。。我有一个链接可以下载zip文件。我已经被允许访问这个网站(我的用户),现在我正在尝试编写一个程序,每隔一段时间获取zip.file,这样我就可以处理它的数据了 当我尝试下载需要验证的代码时(见下面的代码),我得到了一个HTTP401。我想知道为什么,因为我的证件还可以,而且我可以使用浏览器获取文件 HttpWebRequest request; HttpWebResponse response; requ
HttpWebRequest request;
HttpWebResponse response;
request = (HttpWebRequest)WebRequest.Create(strURL);
request.Credentials = ((domain == null || domain == "") ?
new System.Net.NetworkCredential(user, pass) :
new System.Net.NetworkCredential(user, pass, domain)));
response = (HttpWebResponse)request.GetResponse();
//...do somthing
经过阅读和搜索,我得出结论,我必须明确地告诉作者。方法并找到CredentialCache示例。我在打开fiddler后做了些什么,查看网站的响应,发现以下标题:
WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="BACKLOG ::::::: AUTENTICACAO NECESSARIA - USAR APENAS USERNAME E PASSWORD DE DOMINIO"
有了这个,我可以知道什么是auth。键入我需要的,因此我将代码更改为:
HttpWebRequest request;
HttpWebResponse response;
request = (HttpWebRequest)WebRequest.Create(strURL);
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Negotiate", (
(domain == null || domain == "") ?
new System.Net.NetworkCredential(user, pass) :
new System.Net.NetworkCredential(user, pass, domain)));
request.Credentials = cc;
response = (HttpWebResponse)request.GetResponse();
//...do somthing
不过,我还是收到了401HTTP错误。在阅读了更多内容后,我发现我可能需要添加request.PreAuthenticate=true;但结果是一样的。我还读到,我需要使用request.Credentials=System.Net.CredentialCache.DefaultNetworkCredentials;wich停止了401 HTTP错误,但开始给我“尝试了太多的自动重定向”错误wich让我放弃了此ideia,因为默认凭据不是我想要的,我真的希望能够更改用户凭据
经过几次尝试后,我放弃了,尝试了基本的auth。方法,但没有成功(我想我不知何故错过了“领域”部分)
无论如何,我对此失去了一点希望,并且对我所做的所有搜索感到困惑。对于请求和响应,我真的觉得有点傻
谁能在这个问题上给我点启发并帮助我?我更喜欢协商的方法,因为它更安全。我是否必须以某种方式编写第二个请求来模拟握手
========================================================================================================
更新1
在比较了浏览器和应用程序的请求后,我可以看到第一个请求中的一些差异
浏览者
获取HTTP/1.1
接受:application/x-ms-application、image/jpeg、application/xaml+xml、image/gif、image/pjpeg、application/x-ms-xbap、application/vnd.ms-excel、application/vnd.ms-powerpoint、application/msword、application/x-shockwave-flash、/
接受语言:PTSI
用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;WOW64;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;.NET CLR 3.0.30729;Media Center PC 6.0;InfoPath.2;MS-RTC LM 8;.NET4.0E;.NET CLR 1.4322)
接受编码:gzip,deflate
连接:保持活力
主机:example.Host
Cookie:WT_FPC=id=2edd0fbf206582555011375854627180:lv=1375854634144:ss=1375854627180_swa_uv=527730711375858227__utma=163226403.1634134224.1376900542.1376900542.1376900542.1
应用程序
获取HTTP/1.1
主机:example.Host
缓存控制:无存储,无缓存
Pragma:没有缓存
连接:保持活力
在这两个示例中,服务器响应401 HTTP,但存在差异
浏览者
获取HTTP/1.1
接受:application/x-ms-application、image/jpeg、application/xaml+xml、image/gif、image/pjpeg、application/x-ms-xbap、application/vnd.ms-excel、application/vnd.ms-powerpoint、application/msword、application/x-shockwave-flash、/
接受语言:PTSI
用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;WOW64;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;.NET CLR 3.0.30729;Media Center PC 6.0;InfoPath.2;MS-RTC LM 8;.NET4.0E;.NET CLR 1.4322)
接受编码:gzip,deflate
连接:保持活力
主机:example.Host
Cookie:WT_FPC=id=2edd0fbf206582555011375854627180:lv=1375854634144:ss=1375854627180_swa_uv=527730711375858227__utma=163226403.1634134224.1376900542.1376900542.1376900542.1;Apache=10.188.178.249.1416485792985658
应用程序
获取HTTP/1.1
主机:example.Host
Cookie:Apache=10.188.178.249.1416491766480034
缓存控制:无存储,无缓存
Pragma:没有缓存
在此之后,浏览器请求继续发送凭据并获取文件,而我的应用程序不执行其他操作
除了当前标题上的明显差异外,我还注意到cookie标题的差异,这可能是原因吗?我将在roder中发出更多的“浏览”请求,以检查cookie值是否发生更改。我终于做到了 我发现,当用我的代码发出请求时,我被重定向到了第二个url。这个url是固定的,如果我尝试请求第二个链接,我就可以下载文件 还是不明白为什么 我需要确保的是在我的WebRequest中有一个CookieContainer,否则会抛出“尝试了太多自动重定向”异常(我相信这是因为目标尝试设置Cookie) 最终代码-其中strURL是文本中的第二个链接(重定向链接)
如果我不想输入用户名和密码,我想你可以使用类似的方法,或者根本不设置凭据。还是我理解你的问题的方式不对?我使用这种方法,但我得到的错误是在iPhone Safari中未经授权的访问。你对这个问题有什么想法吗?
HttpWebRequest request;
HttpWebResponse response;
request = (HttpWebRequest)WebRequest.Create(strURL);
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Basic", (
(domain == null || domain == "") ?
new System.Net.NetworkCredential(user, pass) :
new System.Net.NetworkCredential(user, pass, domain)));
request.Credentials = cc;
response = (HttpWebResponse)request.GetResponse();
//...do somthing
HttpWebRequest request;
HttpWebResponse response;
request = (HttpWebRequest)WebRequest.Create(strURL);
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Negotiate", (
(domain == null || domain == "") ?
new System.Net.NetworkCredential(user, pass) :
new System.Net.NetworkCredential(user, pass, domain)));
request.Credentials = cc;
request.CookieContainer = new CookieContainer();
response = (HttpWebResponse)request.GetResponse();