C#HTTPWebRequest针对Negotiate / Basic与Realm Site

时间:2014-11-17 13:20:04

标签: c# authentication httprequest basic-authentication negotiate

很抱歉有关此主题的另一个问题,但我一直在阅读,并且无法真正让它发挥作用......

明白点......我已经下载了一个zip文件的链接。我已经被允许访问这个网站(我的用户),现在我试图编写一个程序来每隔一段时间获取一次zip文件,这样我就能用它的数据做事。

当我尝试下载需要身份验证的代码时(请参阅下面的代码),我得到了一个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

在阅读和搜索后,我得出结论,我必须明确告诉auth。方法并找到了CredentialCache示例。我之后做的是打开小提琴手,看看网站的响应情况,并找到了以下标题:

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

但是,我收到了401 HTTP错误。在阅读了一下后,我发现我可能需要添加request.PreAuthenticate = true;但结果是一样的。我也读过,我需要使用request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;这停止了​​401 HTTP错误,但开始给我"尝试了太多的自动重定向"错误让我放弃了这个ideia,因为Default Credentials不是我想要的,我真的希望能够更改用户凭据。

经过几次尝试后,我放弃并尝试了基本身份验证。方法,但没有成功(我想我错过了#34;领域"部分以某种方式)。

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

在比较请求浏览器与应用程序之后,我可以看到第一个请求中的一些差异。

浏览器

获取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- powerpoint,application / msword,application / x-shockwave-flash, / 接受语言:PTSI User-Agent: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) Accept-Encoding:gzip,deflate 连接:保持活力 主持人:example.host Cookie:WT_FPC = id = 2edd0fbf206582555011375854627180:lv = 1375854634144:ss = 1375854627180; _swa_uv = 527730711375858227; __utma = 163226403.1634134224.1376900542.1376900542.1376900542.1

...

应用

获取http://example.host/maps/selector/download?map_name=workline_fornecedores&organization_id=1 HTTP / 1.1 主持人:example.host 缓存控制:无存储,无缓存 Pragma:没有缓存 连接:Keep-Alive

在两个样本中,服务器响应401 HTTP但差异

...

浏览器

获取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- powerpoint,application / msword,application / x-shockwave-flash, / 接受语言:PTSI User-Agent: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) Accept-Encoding:gzip,deflate 连接:保持活力 主持人:example.host Cookie:WT_FPC = id = 2edd0fbf206582555011375854627180:lv = 1375854634144:ss = 1375854627180; _swa_uv = 527730711375858227; __utma = 163226403.1634134224.1376900542.1376900542.1376900542.1;阿帕奇= 10.188.178.249.1416485792985658

...

应用

获取http://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 HTTP / 1.1 主持人:example.host Cookie:Apache = 10.188.178.249.1416491766480034 缓存控制:无存储,无缓存 Pragma:no-cache

在此之后,浏览器请求会保持发送凭据并获取文件,而我的应用程序则不执行任何操作。

除了目前标题上的明显差异外,我还注意到cookie标题差异可能是原因吗?我要做更多的事情"浏览"在roder中请求检查cookie值是否发生变化..

1 个答案:

答案 0 :(得分:4)

我终于设法做到了!

我发现,在使用我的代码发出请求时,我被重定向到第二个网址。此网址已修复,如果我尝试向第二个链接发出请求,我可以下载该文件。

还是不明白为什么......

我必须确定在我的WebRequest中有一个CookieContainer,否则会抛出“尝试太多的自动重定向”异常(我相信这是因为目标尝试设置cookie)。

最终代码 - 其中strURL是文本中的第二个链接(重定向链接)

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