2013-02-04 69 views
4

因此,我正在试图模拟多个登录,在我们的企业网站上同时产生异常,以测试我们的日志框架(我们认为这可能与线程同步有关)。无论如何,所以我需要以编程方式登录我们的网站。这是我到目前为止:使用c#/ ASP.NET以编程方式伪造登录到网站

 // Block 1 
     Uri url = new Uri("http://withheld"); 
     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     request.Method = "GET"; 
     HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
     string viewState = string.Empty; 
     string previousPage = string.Empty; 
     string eventValidation = string.Empty; 
     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
     { 
      string strResponse = reader.ReadToEnd(); 
      viewState = HttpUtility.UrlEncode(GetTagValue(strResponse, "__VIEWSTATE")); 
      previousPage = HttpUtility.UrlEncode(GetTagValue(strResponse, "__PREVIOUSPAGE")); 
      eventValidation = HttpUtility.UrlEncode(GetTagValue(strResponse, "__EVENTVALIDATION")); 
     } 


     // Block 2 
     string username = "user01"; 
     string password = "password99"; 
     HttpWebRequest request2 = WebRequest.Create(url) as HttpWebRequest; 
     request2.KeepAlive = true; 
     request2.Method = "POST"; 
     request2.ContentType = "application/x-www-form-urlencoded"; 
     string postData = string.Format("__LASTFOCUS=&ctrlCreateNewPassword_scriptManagerMaster_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={0}&__PREVIOUSPAGE={1}&__EVENTVALIDATION={2}&UserName={3}&Password={4}&LoginButton=Log+in", new string[] { viewState, previousPage, eventValidation, username, password}); 
     byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
     request2.ContentLength = dataBytes.Length; 
     using (Stream postStream = request2.GetRequestStream()) 
     { 
      // Here's the problem 
      postStream.Write(dataBytes, 0, dataBytes.Length); 
     } 
     HttpWebResponse httpResponse = request2.GetResponse() as HttpWebResponse; 
     // At this point httpResponse.Cookies is null 
     // I believe it's because the line above has actually initiated another 
     // request/response which DOES NOT include the authentication cookie. 
     // See fiddler output below to understand why I think that. 


     // Block 3 
     //Uri url2 = new Uri("http://Withheld/GenerateException.aspx"); 
     //http = WebRequest.Create(url2) as HttpWebRequest; 
     //http.CookieContainer = new CookieContainer(); 
     //http.CookieContainer.Add(httpResponse.Cookies); 
     //HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 

看起来合理简单的权利?那么它不起作用。我不知道我是否需要viewState,不知道是不是,但我想我会尽可能地模仿常规浏览器的功能。

近,我可以告诉发生了什么事是这样的:

  1. 我们打的页面用一个简单的GET。这给了我们视图状态等等,它被解析出来包含在下面的请求中。
  2. 我们现在使用postStream.Write()将视图状态,用户名,密码等发送到服务器。此时服务器会使用身份验证Cookie进行响应,然后将其转发给/Default.aspx。
  3. 现在我们执行reqest2.GetResponse(),但不是获得将我们转发到/default.aspx并拥有身份验证cookie的响应,而是看起来这条线实际上导致另一个请求将我们的资源/ default的.aspx。问题是httpWebResponse不包括我们需要为下一个请求(当前注释掉)的身份验证Cookie。

为什么?这个庄园为什么会这样做,我如何正确处理它。下面是输出从提琴手进一步解释发生了什么事情:

块1产生此请求/响应 请求报头:

GET http://withheld/Login.aspx HTTP/1.1 
Host: withheld 
Connection: Keep-Alive 

响应头:

HTTP/1.1 200 OK 
Connection: close 
Date: Mon, 04 Feb 2013 16:37:37 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Set-Cookie: .EXTASPXAUTH=; expires=Tue, 12-Oct-1999 04:00:00 GMT; path=/; HttpOnly 
Cache-Control: private, no-cache="Set-Cookie" 
Content-Type: text/html; charset=utf-8 
Content-Length: 16975 
Response is the actual login webpage. Omitted for obvious reasons. 

通过代码步进,这请求/响应在调用postStream.Write后立即生成:

请求:

POST http://Withheld/Login.aspx HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Host: withheld 
Content-Length: 2109 
Expect: 100-continue 

__LASTFOCUS=&ctrlCreateNewPassword_scriptManagerMaster_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2fwEPDwUJNTE1NTIxNjkxD2QWAgIDD2QWBgIDDxYCHgVjbGFzcwUQaGVhZGVyX2Jhbm5lcl9lbhYCAgEPFgQeB29uY2xpY2sFI3dpbmRvdy5sb2NhdGlvbj0naHR0cDovL3d3dy5tZG0uY2EnHwAFFmhlYWRlcl9iYW5uZXJfZW5fc21hbGxkAgUPZBYQAgcPDxYEHhdQYXJ0aWFsUmVuZGVyaW5nQ2hlY2tlZGceGUlzUGFydGlhbFJlbmRlcmluZ0VuYWJsZWRoZGQCCQ8PFgQfAmcfA2hkZAIPDw8WBB8CZx8DaGRkAhEPDxYCHg1PbkNsaWVudENsaWNrBcEBamF2YXNjcmlwdDpQYWdlX0NsaWVudFZhbGlkYXRlKCdMb2dpbkN0cmwnKTsgaWYgKFBhZ2VfSXNWYWxpZCkgeyBMb2dpbkJ1dHRvbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7IExvZ2luQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IExvZ2luQnV0dG9uRGlzYWJsZWQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsgfWRkAhkPDxYCHgRUZXh0Bc0BSWYgeW91IHJlcXVpcmUgYXNzaXN0YW5jZSwgb3VyIE1EIE9ubGluZSBTdXBwb3J0IFNwZWNpYWxpc3RzIGNhbiBiZSByZWFjaGVkIGF0ICg4NzcpIDQzMS0wMzMwIG9yIGJ5IGUtbWFpbCBhdCA8YSBocmVmPSJtYWlsdG86d2Vic3VwcG9ydEBjbWEuY2EiPndlYnN1cHBvcnRAY21hLmNhPC9hPi48YnI%2bPGJyPldlIGVuY291cmFnZSB5b3UgdG8gcmV2aWV3IHRoZWRkAhsPDxYCHwQFOXdpbmRvdy5vcGVuKCdodHRwOi8vMTkyLjE2OC4xNjUuMzIvbGVnYWwvJyk7cmV0dXJuIGZhbHNlO2RkAh8PDxYCHwQFRndpbmRvdy5vcGVuKCdodHRwOi8vMTkyLjE2OC4xNjUuMzIvc3lzdGVtLWVuaGFuY2VtZW50LycpO3JldHVybiBmYWxzZTtkZAIhDw8WAh8EBUZ3aW5kb3cub3BlbignaHR0cDovLzE5Mi4xNjguMTY1LjMyL3N5c3RlbS1lbmhhbmNlbWVudC8nKTtyZXR1cm4gZmFsc2U7ZGQCCQ9kFgICAQ9kFgICAg9kFgJmD2QWAgIBD2QWAgIdDw8WAh8EBfsBamF2YXNjcmlwdDpjdHJsQ3JlYXRlTmV3UGFzc3dvcmRfQ3JlYXRlTmV3UGFzc3dvcmRQdXNoQnV0dG9uLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgY3RybENyZWF0ZU5ld1Bhc3N3b3JkX0NyZWF0ZU5ld1Bhc3N3b3JkUHVzaEJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyBjdHJsQ3JlYXRlTmV3UGFzc3dvcmRfQ3JlYXRlTmV3UGFzc3dvcmRQdXNoQnV0dG9uRGlzYWJsZWQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUMaWJ0bk1vcmVJbmZvdZmFXkMbPfVWPQYtreXvFt8Bck8%3d&__PREVIOUSPAGE=1aYW5DqTKrT4ieGPkHcnrQLIq8lEcSIVkql1EugwSQNV_5102t5D7QDmOnuQFA4Tz9Mh5-CEYpkRngMROFFeeAG12Ss1&__EVENTVALIDATION=%2fwEWCQKKr%2bXcBgKvruq2CALSxeCRDwL%2bjNCfDwKH8YSKBgKN6O7XCwKz9P38DALl3I74DwLWxI74D6Nz%2f2bCBFC%2bM9glZmEyM%2byOCTZg&UserName=user01&Password=password99&LoginButton=Log+in 

响应:

HTTP/1.1 302 Found 
Connection: close 
Date: Mon, 04 Feb 2013 16:36:55 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Location: /Default.aspx?locale=en 
Set-Cookie: .EXTASPXAUTH=65BB5BFDD274F730E26CAEAAEB417792A764E7B8E8C6C9AC8C47FA97EF35DFACF551A53EAA6EA67D868C8A9BF55EBA758A5E724C58269028EE48F56268A204CBED19B60FC1AF58892989D9546202C037E97BF0EEE6A6281FF5EEA461BC30C5C7A71DFD64027AEB796D3FD21AE97ECFB16FF0F95C; path=/; HttpOnly 
Cache-Control: private, no-cache="Set-Cookie" 
Content-Type: text/html; charset=utf-8 
Content-Length: 140 

<html><head><title>Object moved</title></head><body> 
<h2>Object moved to <a href="/Default.aspx?locale=en">here</a>.</h2> 
</body></html> 

注意上面的响应包括authenication的cookie。 现在我们运行下面的代码行以获取该cookie的意图:

HttpWebResponse httpResponse = request2.GetResponse() as HttpWebResponse; 

但是相反在小提琴手会生成以下请求/响应:

请求:

GET http://withtheld/Default.aspx?locale=en HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Host: withheld 

响应:

HTTP/1.1 302 Found 
Connection: close 
Date: Mon, 04 Feb 2013 16:37:38 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Location: /Login.aspx?ReturnUrl=%2fDefault.aspx%3flocale%3den&locale=en 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Content-Length: 182 

<html><head><title>Object moved</title></head><body> 
<h2>Object moved to <a href="/Login.aspx?ReturnUrl=%2fDefault.aspx%3flocale%3den&amp;locale=en">here</a>.</h2> 
</body></html> 

我相信这是回应httpResponse现在包含。在登录完成后,我如何才能真正获得cookie来请求另一个受保护的页面?

谢谢!

+2

我明白所有这些可能都很重要,但我相信如果你的问题更简单,更多的人会倾向于帮助你;即“这是我得到的错误”或“为什么X变量是NULL”。 – user1477388

+0

也许你不应该重新发明轮子,而是使用cURL(http://curl.haxx.se/)。 – Hogan

+3

当然,我可以发布我的代码,并说:“它怎么不起作用?”。你可以打赌,除了问题之外,我不会得到很多有用的回复。这也表明(我认为)我已经做了一些家庭作业,而且我不只是希望得到答案。如果因为时间太长而不想提供帮助,那么请尽一切努力,随时随地。 – monkeybuffer

回答

2

事实证明,我在这里有两个问题。其中之一是,我需要调用此。

request.AllowAutoRedirect = false 

这将阻止框架刚刚跳过了身份验证cookie在它的响应,居然还给我们感兴趣的响应

的其他问题是您必须创建CookieContainer的新实例并将其分配给请求。如果没有这样做Response.Cookies不包含cookie。一旦你分配了你自己的容器,它就会在响应完成后填充。我不知道为什么。

+0

我无法弄清楚如何让它工作,但这里的例子为我做到了这一点:http://odetocode.com/articles/162.aspx –

1

当您登录时,身份验证令牌将作为cookie从服务器发送到您的客户端。您需要存储此cookie,然后在每次未来请求时重新发送该cookie。重新发送cookie会告诉服务器您已被认证为特定用户。

起来,应对被送到您登录后饼干:

HttpCookieCollection loginResponseCookies = Response.Cookies; 

这个系列将包括身份验证cookie的,任何会话cookie等

然后,就重新发送这些cookie随后的每一个请求,并且服务器将对您进行身份验证。

foreach(HttpCookie loginResponseCookie in loginResponseCookies) 
{ 
    Response.Cookies.Add(loginResponseCookie); 
} 
+1

对不起,我的问题没有足够的说明。我知道我需要发送身份验证Cookie以进一步回复。问题是httpResponse.Cookies为null。我更新了第一个带有注释的代码片段来解释。感谢您花时间回答。 – monkeybuffer