c# - C#HTTPWebRequest与领域网站进行协商/基本

标签 c# authentication httprequest basic-authentication negotiate

很抱歉再次提出有关此主题的问题,但我一直在阅读,并不能使其真正发挥作用...

切入要点...我有一个链接,该链接将下载一个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


在阅读和搜索之后,我得出的结论是我必须明确告诉auth。方法并找到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
Cookie: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
缓存控制:无存储,无缓存
语法:无缓存
连接:保持活动

在两个示例中,服务器响应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
Cookie: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
Cookie:Apache = 10.188.178.249.1416491766480034
缓存控制:无存储,无缓存
语法:无缓存

此后,浏览器请求将继续发送凭据并获取文件,而我的应用程序则什么也不做。

除了当前标头上的明显区别外,我还指出了cookie标头的不同可能是原因吗?我将在Roder中提出更多“浏览”请求,以检查Cookie值是否发生更改。

最佳答案

我终于做到了!

我发现,使用我的代码发出请求时,我被重定向到第二个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();

关于c# - C#HTTPWebRequest与领域网站进行协商/基本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26973657/

相关文章:

c# - 有关 ASP.NET 2.0 应用程序设计的问题

C# ToDictionary 在 C# 7 之前获取匿名类型值

java - 如何使用 ADAL JS 颁发的隐式授权 token 从 Web API 访问图形 API

api - Binance API key

django - django/apache 限制最大并发请求数

java - Play Framework 2.x : How do i make a HTTP-GET for an reverse lookup (nominatim OSM)?

c# - 将 wav 文件转换为 wav 文件(更改格式)

c# - 检查 null 返回的项目

java - 如何使用 Java 登录网站并保持登录状态?

django 使用 google 应用帐户登录