2010-11-12 94 views
4

好吧我昨天試過這個問題,但我不確定如果我給了足夠的信息,我有一個答案,但它沒有爲我工作。基本上我正在做的是用戶打開這個Windows窗體應用程序並登錄。之後,他們在文本框中輸入一些文本,然後單擊運行。此時,run函數正在向需要登錄的服務器發送Web請求(在打開程序後最初完成的登錄)。由於某些原因,即使執行第二個請求時仍然沒有看到用戶已登錄我不知道我在做什麼錯,但我會發布我的代碼,以便您可以進一步幫助我C#WebRequest登錄會話

這是爲用戶登錄時執行的功能,當用戶進入應用程序。

private void button1_Click(object sender, EventArgs e) 
{ 
    string paramaters = "authmethod=on&chkRememberMe=on&login-form-type=pwd&password=" + pw.Text + "&userid=" + uid.Text + "&username=" + uid.Text; 
    string strResponse; 
    HttpWebRequest requestLogin = (HttpWebRequest)WebRequest.Create("https://www.url.com/login.form"); 
    requestLogin.Method = "POST"; 
    requestLogin.CookieContainer = cookieJar; 
    requestLogin.ContentType = "application/x-www-form-urlencoded"; 

    requestLogin.ContentLength = paramaters.Length; 
    StreamWriter stOut = new StreamWriter(requestLogin.GetRequestStream(), System.Text.Encoding.ASCII); 
    stOut.Write(paramaters); 
    stOut.Close(); 

    HttpWebResponse responseLogin = (HttpWebResponse)requestLogin.GetResponse(); 
    StreamReader stIn = new StreamReader(responseLogin.GetResponseStream()); 
    strResponse = stIn.ReadToEnd(); 
    stIn.Close(); 

    //Add cookies to CookieJar (Cookie Container) 
    foreach (Cookie cookie in responseLogin.Cookies) 
    { 
     cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
     richTextBox2.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
    } 

    if (strResponse.Contains("Log On Successful") || strResponse.Contains("already has a webseal session")) 
    { 
     foreach (Control cont in this.Controls) 
     { 
      cont.Visible = true; 
     } 
     loginPanel.SendToBack(); 
     loginPanel.Visible = false; 
    } 
    else 
    { 
     MessageBox.Show("Login failed."); 
    } 
} 

這是功能,當用戶點擊「運行」按鈕來啓動對消費者帳戶的測試,是跑了。

private string runTestRequest(Uri url, string parameters) 
{ 
    string testResults = string.Empty; 
    HttpWebRequest runTest = (HttpWebRequest)WebRequest.Create(url); 
    runTest.CookieContainer = cookieJar; 
    runTest.Method = "POST"; 
    runTest.ContentType = "application/x-www-form-urlencoded"; 
    StreamWriter stOut = new StreamWriter(runTest.GetRequestStream(), System.Text.Encoding.ASCII); 
    stOut.Write(parameters); 
    stOut.Close(); 
    StreamReader stIn = new StreamReader(runTest.GetResponse().GetResponseStream()); 
    testResults = stIn.ReadToEnd(); 
    stIn.Close(); 
    return testResults; 
} 

,當然這是我的cookie容器對象

public CookieContainer cookieJar = new CookieContainer(); 

P.S .:的webrequests的領域是不同的。第一個是abc.com第二個是123.com唯一的問題是,第一個域(這是登錄)是一個像123.com這樣的內部web應用程序的全局登錄,那麼我如何使用第一個域的登錄會話第二個領域?

請你幫忙幫我弄清楚我做錯了什麼。

+0

沒有訪問任何一個站點並查看他們如何處理會話,我會假定第一個令牌傳遞給第二個確認它的授權和接受。有沒有一個網址,你沒有看到或什麼?也可以推薦使用Firefox/TamperData來查看所有事務,看看您是否事實上覆制了它正在執行的所有事務。 編輯:此外,我懷疑餅乾是令牌,雖然我可能是錯的,因爲這將是XSS攻擊。有些東西要麼發佈/獲取數據在某處傳遞。 – 2010-11-12 16:00:33

回答

1

我發現發生了什麼事是它重新回到與第二個(123.com)相同的域使用登錄的子域。顯然他們有這個全球登錄系統建立在多個域上來傳遞cookie。上面的代碼工作,我現在有它的工作。謝謝!!

1
string url = "http://www.ABC/MemberShip/Login.aspx";// HttpContext.Current.Request.Url.AbsoluteUri.ToString().Replace("AutoLogin", "Login"); 
CookieContainer myCookieContainer = new CookieContainer(); 
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
request.CookieContainer = myCookieContainer; 
request.Method = "GET"; 
request.KeepAlive = false; 

HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

System.IO.Stream responseStream = response.GetResponseStream(); 
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8); 
string srcString = reader.ReadToEnd(); 

// get the page ViewState     
string viewStateFlag = "id=\"__VIEWSTATE\" value=\""; 
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length; 
int j = srcString.IndexOf("\"", i); 
string viewState = srcString.Substring(i, j - i); 

// get page EventValidation     
string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\""; 
i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length; 
j = srcString.IndexOf("\"", i); 
string eventValidation = srcString.Substring(i, j - i); 

string submitButton = "LoginButton"; 

// UserName and Password 
string userName = "userid"; 
string password = "password"; 
// Convert the text into the url encoding string 
viewState = System.Web.HttpUtility.UrlEncode(viewState); 
eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation); 
submitButton = System.Web.HttpUtility.UrlEncode(submitButton); 

// Concat the string data which will be submit 
string formatString = 
     "txtUserName={0}&txtPassword={1}&btnSignIn={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}"; 
string postString = 
     string.Format(formatString, userName, password, submitButton, viewState, eventValidation); 

// Convert the submit string data into the byte array 
byte[] postData = Encoding.ASCII.GetBytes(postString); 

// Set the request parameters 
request = WebRequest.Create(url) as HttpWebRequest; 
request.Method = "POST"; 
request.Referer = url; 
request.KeepAlive = false; 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.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; CIBA)"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.CookieContainer = myCookieContainer; 
System.Net.Cookie ck = new System.Net.Cookie("TestCookie1", "Value of test cookie"); 
ck.Domain = request.RequestUri.Host; 
request.CookieContainer.Add(ck); 
request.CookieContainer.Add(response.Cookies); 

request.ContentLength = postData.Length; 

// Submit the request data 
System.IO.Stream outputStream = request.GetRequestStream(); 
request.AllowAutoRedirect = true; 
outputStream.Write(postData, 0, postData.Length); 
outputStream.Close(); 


// Get the return data 
response = request.GetResponse() as HttpWebResponse; 
responseStream = response.GetResponseStream(); 
reader = new System.IO.StreamReader(responseStream, Encoding.UTF8); 
srcString = reader.ReadToEnd(); 
Response.Write(srcString); 
Response.End(); 
+0

沒有實現IDisposable()實際處置。 – 2015-10-20 03:00:59