浏览器http auth验证自动登录

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NetworkCredential用程序现登陆IE弹出窗口验证用户名和密码的页面【转】



这个问题是这样的,有时候登陆一个网站,会弹出一个对话框,要求输入用户名和密码。验证通过,就显示相关页面,验证不通过,就出现一个401 Unauthorized 的错误。如果想用客户端程序自动来完成这个登录操作该怎样做?
问题的提出是这样的。我在做一个抓取其他网站数据的软件。被抓取的网站设置了一些规则,当访问量超过一定的数量时,就屏蔽这个访问的IP地址。所以我的软件经常是工作了一段时间就无法正常抓到数据了,程序提示 “远程服务器返回错误: (403) 已禁止” 。于是,我就设置本地的路由器,让路由器断开当前连接,重新获得一个IP地址,然后程序又能正常工作一段时间,直道下次达到访问数据的上限,再次被屏蔽。做软件来抓取数据,目的就是节省人工,我总不能总盯着这个程序,一旦被屏蔽,就重新启动路由器,尤其是夜间工作的时候,一旦被屏蔽,估计这个晚上这台服务器就白开着了,啥也下载不到了。于是想到,一旦软件检测到远程服务器屏蔽了本地的IP地址,立刻指挥路由器重新断开当前连接,获得一个新的IP地址。按说这个也不难,就是提交相应的页面就行了。偏偏我用的这个Vigor2104的路由器,采用弹出窗口的校验用户的方式,不是用普通的在页面中放个form,里面有Username, password 两个字段,然后用POST方法一提交就能解决的。
面对新的挑战,我没有放弃,打开Sniffer Pro 嗅探软件,抓取每个从本地计算机和路由器IP的通信,研究登陆过程的每个数据包。经过仔细比对,经过查找用户名"admin" 的方法查找,但是出乎意料的是,无论如何都找不到用户名和密码能匹配的数据包。我意识到登陆过程显然是经过加密了的。后来发现了这个比较特殊的字符串。“Authorization: Basic YWRtaW46Zmxvd2VycG93ZXI=” 我按照Authorization 在Google查找,终于了解到这是一种HTTP 验证协议。用户名和密码是用MD5或者Base64进行加密传输的。于是想到在提交URL请求的时候,把这段代码放到HTTP头里面去。于是作了实验,放到 httpReq.Connection = "Authorization: Basic YWRtaW46Zmxvd2VycG93ZXI=" 结果失败了。
经过反复试验,终于在MSDN的帮助文件中找到了正确的方法,用这样的例子
Dim myCache As New CredentialCache()
myCache.Add(New Uri("/"), "Basic", New NetworkCredential(UserName, SecurelyStoredPassword))
wReq.Credentials = myCache
我的程序中完整地代码如下 :
' 传递进来的是一个URL地址,用户名,密码 , 返回的是这个URL地址对应的HTML返回数据 对应的是HTTP 弹出窗口密码验证。
Public Function GetHTTP_Au

thorization(ByVal URL, ByVal myusername, ByVal mypassword) As String
On Error GoTo Err_here
Dim httpURL As New System.Uri(URL)
Dim httpReq As .HttpWebRequest
Dim httpResp As .HttpWebResponse
Dim cookHeader As String
httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
httpReq.Method = "GET"
httpReq.Accept = "*.*"
erAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; Alexa
Toolbar)"
'下面2行代码是临时用于测试的。
httpReq.PreAuthenticate = True
Dim myCache As New CredentialCache
myCache.Add(New Uri("http://192.168.0.1"), "Basic", New NetworkCredential(myusername, mypassword))
httpReq.Credentials = myCache
httpReq.CookieContainer = New CookieContainer
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
httpReq.KeepAlive = True ' 获取或设置一个值,该值指示是否与 Internet 资源建立持久连接。
'************* 获得 Cookies *****************

httpResp.Cookies = httpReq.CookieContainer.GetCookies(httpReq.RequestUri)
If httpReq.CookieContainer.Count > 0 Then
LastPageCookie = httpResp.Cookies
End If
'*******************************************
Dim reader As StreamReader = New StreamReader(httpResp.GetResponseStream)
Dim respHTML As String = reader.ReadToEnd() 'respHTML就是网页源代码
reader.Close()
httpResp.Close()
Return respHTML
Exit Function
Err_here:
myPublic.Write_Log("Error.log", "GetHtmlCode 模块:" & Err.Description & " " & URL)
Return "Null"
End Function
用这段代码,我就实现了可以通过路由器弹出窗口的那种用户名和密码的校验,然后,提交重新拨号的那个URL地址就能让路由器断开当前连接,并重新获得新的IP地址了。 我的抓取程序就可以流畅的运行了。一旦被对方服务器屏蔽,就调用这个重启路由器的函数。
这中间也有过几次想放弃,但是经过不断的尝试,终于可以搞定这个难题了。所以所坚持到底就是胜利,失败是成功之母。



public string GetHTTP_Authorization(string url, string myusername, string mypassword)
{

Uri httpURL = new Uri(url);

//HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create("/gb/about/overview.html");


HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(httpURL);
httpReq.Method = "GET";
httpReq.Accept = "*.*";
erAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; AlexaToolbar)";
//下面2行代码是临时用于测试的。
httpReq.PreAuthenticate = true;
CredentialCache myCache = new CredentialCache()

;

myCache.Add(new Uri(url), "Basic", new NetworkCredential(myusername, mypassword));
httpReq.Credentials = myCache;
httpReq.CookieContainer = new CookieContainer();

HttpWebResponse httpResp = (HttpWebResponse)httpReq.GetResponse();
httpReq.KeepAlive = true;//获取或设置一个值,该值指示是否与 Internet 资源建立持久连接。
//************* 获得 Cookies *****************
// httpResp.Cookies = httpReq.CookieContainer.GetCookies(httpReq.RequestUri);

// if (httpReq.CookieContainer.Count > 0)
// {
// CookieCollection LastPageCookie = httpResp.Cookies;
// }

//*******************************************
// StreamReader reader = new StreamReader(httpResp.GetResponseStream());
//string respHTML = reader.ReadToEnd();//respHTML就是网页源代码
// reader.Close();
// httpResp.Close();
return "true";
// return respHTML;
}


相关文档
最新文档