【发布时间】:2014-11-17 13:20:03
【问题描述】:
很抱歉就这个主题提出了另一个问题,但我一直在阅读,但无法真正让它发挥作用......
言归正传...我有一个可以下载 zip 文件的链接。我已经获得了对这个网站(我的用户)的访问权限,现在我正在尝试编写一个程序来每隔一段时间获取 zip.file,以便我可以对其数据进行处理。
当我刚刚尝试下载需要身份验证的内容(见下面的代码)的代码时,我得到了 HTTP 401。我想知道为什么,因为我的凭据没问题,我可以使用浏览器获取文件。
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 示例。之后我做的是打开提琴手,看看网站响应了什么,发现了以下标题:
WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="BACKLOG ::::::: AUTENTICACAO NECESSARIA - USAR APENAS USERNAME E PASSWORD DE DOMINIO"
有了这个我可以知道什么身份验证。我需要的类型,所以我将代码更改为以下内容:
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
我仍然收到 401 HTTP 错误。在阅读了更多内容后,我发现我可能需要添加 request.PreAuthenticate = true;但结果是一样的。我也读到了,我需要使用 request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;停止了 401 HTTP 错误,但开始给我“尝试了太多自动重定向”错误,这让我放弃了这个想法,因为默认凭据不是我想要的,我真的希望能够更改用户凭据。
经过几次尝试后,我放弃并尝试了基本身份验证。方法但没有成功(我想我以某种方式错过了“领域”部分)。
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
无论如何,我对此失去了一点希望,并对我所做的所有搜索感到困惑。对于请求和响应,我真的觉得有点愚蠢......
任何人都可以对这个主题有所了解并帮助我吗?我更喜欢协商方法,因为它更安全。我是否必须以某种方式编写第二个请求来模拟握手??
================================================ ==================================================== ======= 更新 1
比较浏览器和应用程序的请求后,我可以看到第一个请求存在一些差异。
浏览器
GET http://example.host/maps/selector/download?map_name=workline_fornecedores&organization_id=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-简报,应用程序/msword,应用程序/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;Media Center PC 6.0 ;InfoPath.2;MS-RTC LM 8;.NET4.0C;.NET4.0E;.NET CLR 1.1.4322) 接受编码:gzip,放气 连接:保持活动 主机:example.host 饼干:WT_FPC=id=2edd0fbf206582555011375854627180:lv=1375854634144:ss=1375854627180; _swa_uv=527730711375858227; __utma=163226403.1634134224.1376900542.1376900542.1376900542.1
....
应用程序
GET http://example.host/maps/selector/download?map_name=workline_fornecedores&organization_id=1 HTTP/1.1 主机:example.host 缓存控制:无存储,无缓存 Pragma:无缓存 连接:保持活动状态
在两个示例中,服务器都响应 401 HTTP,但存在差异
...
浏览器
GET http://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 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-简报,应用程序/msword,应用程序/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;Media Center PC 6.0 ;InfoPath.2;MS-RTC LM 8;.NET4.0C;.NET4.0E;.NET CLR 1.1.4322) 接受编码:gzip,放气 连接:保持活动 主机:example.host 饼干:WT_FPC=id=2edd0fbf206582555011375854627180:lv=1375854634144:ss=1375854627180; _swa_uv=527730711375858227; __utma=163226403.1634134224.1376900542.1376900542.1376900542.1;阿帕奇=10.188.178.249.1416485792985658
...
应用程序
GET http://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 HTTP/1.1 主机:example.host 饼干:阿帕奇=10.188.178.249.1416491766480034 缓存控制:无存储,无缓存 Pragma: 无缓存
在此之后,浏览器请求继续发送凭据并获取文件,而我的应用程序什么也不做。
除了当前标头的明显差异外,我还注意到 cookie 标头差异可能是原因吗?我将在 roder 中发出更多“浏览”请求,以检查 cookie 值是否发生变化..
【问题讨论】:
标签: c# authentication httprequest basic-authentication negotiate