2013-03-29 64 views
1

我有一個本地網站(不是我的),需要認證之前做一些查詢。認證頭看起來是這樣的:如何在C#中的文章之前進行身份驗證?

Host: 192.168.7.9 
Connection: keep-alive  
Content-Length: 185 
Origin: http://192.168.7.9 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/27.0.1453.3 Safari/537.36 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Accept: */* 
DNT: 1 
Referer: http://192.168.7.9/signin 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Cookie: _FProEnterprise_session=BAh7CzoVbmVlZF93ZWxjb21lX21zZ1Q6D3Nlc3Npb25faWQiJTUxNjI5OGRiMDNmNjU4ZDg4ODE3NmFiZjhmMDU3YTI2OglzaXRlSSIKc2l0ZTAGOgZFRjoObGFuZ19wYXRoSSIHZW4GOwhUOg5vbmVfY2xpY2tGOgx1c2VyX2lkaRE%3D--0c6634a714baa7f0e4795aee89b31f9b7ec0565e 

和請求體看起來是這樣的:

username=myusername&password=mypassword 

我不是認證是如何工作的超極。首先,這是表單身份驗證?我猜是這樣,因爲我必須在網站上輸入我的用戶名和密碼,然後提交進入。

二,爲什麼有一個Cookie已經在那裏?也許是以前的會話,我可以忽略它嗎?

我的目標是在C#中重現這一點,以便我可以驗證,獲取cookie,然後發佈數據並從此站點檢索結果。至少這就是我認爲我需要做的事情。鏈接和代碼會很有幫助。如果有幫助,我需要從我的web.api應用程序控制器發出這個請求。

回答

0

這個環節解決了這個問題對我來說: HERE

我的最終代碼(在我web.api控制器看起來是這樣):

public static string JsonWithAuth(string url, string data) 
    { 
     var bytes = Encoding.Default.GetBytes(data); 

     using (var client = new WebClientEx()) 
     { 
      var values = new NameValueCollection 
      { 
       { "username", "myUsername" }, 
       { "password", "myPassword" }, 
      }; 
      // Authenticate 
      client.UploadValues("http://192.168.7.9/main/signin", values); 

      // Post data 
      var response = client.UploadData(url, "POST", bytes); 

      return Encoding.Default.GetString(response); 
     } 
    } 

這是使工作類(從鏈接的答案):

/// <summary> 
/// A custom WebClient featuring a cookie container 
/// </summary> 
public class WebClientEx : WebClient 
{ 
    public CookieContainer CookieContainer { get; private set; } 

    public WebClientEx() 
    { 
     CookieContainer = new CookieContainer(); 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = CookieContainer; 
     } 
     return request; 
    } 
} 

所以我最終調用是這樣的:

string sampleInfo = JsonWithAuth(
    "http://192.168.7.9/samples/sample_locations_list", 
    "sort=position&dir=ASC&box_id="); 

希望能幫助別人!

0

您使用asp.net membership provider,做像Membership.ValidateUser()的身份驗證和,也將驗證formsauthentication。檢查是否驗證(Context.User.Identity.IsAuthenticated) - FormsAuthentication.SignOut();

您需要sql server或某種認證機制才能保存用戶名和密碼。

+0

我很困惑......我沒有對用戶進行身份驗證,我試圖訪問的網站以我希望標題顯示的方式進行身份驗證。我需要進行身份驗證,獲取cookie,然後使用該cookie(我認爲)來獲取我需要的數據。 – Nicros

0

這似乎是一個AJAX請求(X-Requested-With:XMLHttpRequest)。因此,用戶必須先在網頁上,即會話開始時。那就是當用戶獲得會話cookie時,每次發送會話cookie以跟蹤會話。此會話也保存在服務器上,在該服務器上存儲登錄信息 - 無論您是否登錄,以及您是誰。

內容似乎是一個簡單的HTTP表單,但由於它來自XMLHttpRequest,所以它可以使用Javascript創建。這至少是通過HTTP發送POST數據的標準方式。

+0

是否有可能在C#中重現這一點?我可以在ajax中做到這一點......我只是覺得在C#中做起來更容易。你會碰巧有一個鏈接代碼(C#或ajax),可以驗證,存儲cookie,然後在隨後的請求中使用該cookie? – Nicros

相關問題