[英]Authenticate on an ASP.Net Forms Authorization website from a console app
[英]Console app to login to ASP.NET website
首先,請原諒我對這個主題的天真。 我是一個退休的程序員,在DOS出現之前就開始了。 我不是ASP.NET的專家。 我需要知道的部分內容是我需要知道的。 (如果你跟着我...)
所以我想登錄一個網站並抓取一些內容。 在使用notepad和fiddler2查看HTML源代碼之后,我很清楚該站點是使用ASP.NET技術實現的。
我開始做了很多google'ing並閱讀了我在c#中編寫屏幕抓取器的所有內容。 經過一番調查和多次嘗試后,我想我已經得出結論,這並不容易。
問題的關鍵(我現在看到的)是ASP為程序員提供了很多維護狀態的方法。 Cookie,viewstate,session vars,page vars,get和post params等。此外,程序員可以在服務器和客戶端腳本之間划分工作。 諸如IE或Safari或Chrome或Firefox之類的富Web客戶端知道如何處理程序員編寫的任何內容(以及ASP框架實現的內容)。
WebClient不是富Web客戶端。 它甚至不知道如何實現cookie。
所以我陷入了僵局。 一種方法是嘗試對ASP應用程序所期望的富客戶端的所有功能進行反向工程,並在類固醇類上編寫WebClient,模擬富客戶端以便登錄。
或者我可以嘗試將IE(或其他一些富客戶端)嵌入到我的應用程序中,並希望暴露的界面足夠豐富,以便我可以以編程方式填充用戶名和密碼字段並將表單POST回來。 (並訪問響應流,以便我可以解析HTML以清除我之后的數據...)
或者我可以尋找一些比WebClient更豐富的第三方控件。
任何人都可以對我應該集中注意力的地方有一些敏銳的洞察力嗎?
這與項目一樣具有學習經驗。 也就是說,我真的想自動從目標站點進行登錄和信息檢索。
這是我用來登錄網站並獲取我的cookie的示例函數
string loginSite(string url, string username, string password)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string cookie = "";
//this values will change depending on the website
string values = "vb_login_username=" + username + "&vb_login_password=" + password
+ "&securitytoken=guest&"
+ "cookieuser=checked&"
+ "do=login";
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = values.Length;
CookieContainer a = new CookieContainer();
req.CookieContainer = a;
System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error
using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) { writer.Write(values); }
HttpWebResponse c = (HttpWebResponse)req.GetResponse();
Stream ResponseStream = c.GetResponseStream();
StreamReader LeerResult = new StreamReader(ResponseStream);
string Source = LeerResult.ReadToEnd();
foreach (Cookie cook in c.Cookies) { cookie = cookie + cook.ToString() + ";"; }
return cookie;
}
這里有一個電話示例:
string Cookie = loginSite("http://theurl.comlogin.php?s=c29cea718f052eae2c6ed105df2b7172&do=login", "user", "passwd");
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.theurl.com");
//once you got the cookie you add it to the header.
req.Headers.Add("cookie", Cookie);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
using (Stream respStream = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(respStream))
{
string s = sr.ReadToEnd();
HtmlReturn = s;
// System.Diagnostics.Debugger.Break();
}
}
使用Firefox,您可以使用擴展HTTP-Headers來了解post發布的參數,並修改變量值:
string values = "vb_login_username=" + username + "&vb_login_password=" + password
+ "&securitytoken=guest&"
+ "cookieuser=checked&"
+ "do=login";
與目標網站上的參數匹配。
如果您決定使用firefox的Live-HTTP-HEaders,當您登錄網站時,您將從標題中獲取帖子信息,如下所示:
GET / HTTP / 1.1主機:www.microsoft.com用戶代理:Mozilla / 5.0(Windows NT 6.1; rv:15.0)Gecko / 20100101 Firefox / 15.0.1接受:text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8 Accept-Language:es-es,es; q = 0.8,en-us; q = 0.5,en; q = 0.3 Accept-Encoding:gzip,deflate Connection:keep-alive Cookie:WT_FPC = id = 82.144.112.152-154450144.30258861:lv = 1351580394112:ss = 1351575867559; WT_NVR_RU = 0 = MSDN:1 = 2 =; omniID = 0d2276c2_bbdd_4386_a11d_f8da1dbc5489; MUID = 349E06C547426937362B02CC434269B9; MC1 = GUID = 47b2ed8aeea0de4797d3a40cf549dcbb&HASH = 8aed&LV = 201210&V = 4&LU = 1351608258765; A = I&I = AxUFAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg !!&V = 4; MSDN = L = EN-US
我懷疑您可以構建可以為您執行此操作的Chrome擴展程序。
順便說一下,你不是“安全專家”嗎?
你為什么不使用IE,在Windows Forms中自動化IE非常簡單,另外你也可以輕松處理代理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.