C#HTTPWebRequest针对与领域网站协商/基本

C#HTTPWebRequest针对与领域网站协商/基本,c#,authentication,httprequest,basic-authentication,negotiate,C#,Authentication,Httprequest,Basic Authentication,Negotiate,很抱歉,我又问了一个关于这个话题的问题,但我一直在阅读,不能让它真正起作用 开门见山。。。我有一个链接可以下载zip文件。我已经被允许访问这个网站(我的用户),现在我正在尝试编写一个程序,每隔一段时间获取zip.file,这样我就可以处理它的数据了 当我尝试下载需要验证的代码时(见下面的代码),我得到了一个HTTP401。我想知道为什么,因为我的证件还可以,而且我可以使用浏览器获取文件 HttpWebRequest request; HttpWebResponse response; requ

很抱歉,我又问了一个关于这个话题的问题,但我一直在阅读,不能让它真正起作用

开门见山。。。我有一个链接可以下载zip文件。我已经被允许访问这个网站(我的用户),现在我正在尝试编写一个程序,每隔一段时间获取zip.file,这样我就可以处理它的数据了

当我尝试下载需要验证的代码时(见下面的代码),我得到了一个HTTP401。我想知道为什么,因为我的证件还可以,而且我可以使用浏览器获取文件

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();