C# HTTPWebRequest against Negotiate/Basic with Realm Site

本文关键字:with Realm Site Basic HTTPWebRequest against Negotiate | 更新日期: 2023-09-27 18:30:41

很抱歉对这个主题做了另一个问题,但我一直在阅读,但无法真正让它工作......

切中要害...我有一个链接可以下载一个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错误。阅读更多内容后,我发现我可能需要添加请求。预身份验证 = 真;但结果是一样的。我也读过,我需要使用请求。凭据 = System.Net.CredentialCache.DefaultNetworkCredentials;wich 停止了 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

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

浏览器

获取 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用户代理:Mozilla/4.0(兼容;微星 7.0;视窗NT 6.1;哇64;三叉戟/4.0;SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;媒体中心PC 6.0;信息路径.2;MS-RTC LM 8; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322)接受编码:gzip,放气连接:保持活动状态主机:示例主机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主机:示例主机缓存控制:无存储,无缓存杂注:无缓存连接:保持活动状态

在这两个示例中,服务器响应 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用户代理:Mozilla/4.0(兼容;微星 7.0;视窗NT 6.1;哇64;三叉戟/4.0;SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;媒体中心PC 6.0;信息路径.2;MS-RTC LM 8; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322)接受编码:gzip,放气连接:保持活动状态主机:示例主机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://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 HTTP/1.1主机:示例主机Cookie:Apache=10.188.178.249.1416491766480034缓存控制:无存储,无缓存杂注:无缓存

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

除了当前标头的明显差异外,我还注意到cookie标头差异可能是原因吗?我将在 roder 中发出更多"浏览"请求以检查 cookie 值是否更改。

C# HTTPWebRequest against Negotiate/Basic with Realm Site

我最终做到了!

发现,当使用我的代码发出请求时,我被重定向到第二个 url。此 url 是固定的,如果我尝试向第二个链接发出请求,我可以下载该文件。

还是不明白为什么...

我所要做的就是在我的 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();