2012-06-20 134 views
22

我正在嘗試訪問同一域/同一個asp.net應用程序的網頁,即密碼保護。證書對於網頁觸發此調用和網頁訪問都是相同的。WebClient使用憑據訪問頁面

這是代碼,我不知道爲什麼我總是以登錄表單html代碼結束?

using (WebClient client = new WebClient()) 
{ 
    client.QueryString.Add("ID", "1040"); //add parameters 
    //client.Credentials = CredentialCache.DefaultCredentials; 
    //I tried to add credentials like this 
    client.Credentials = new NetworkCredential("username", "password"); 

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 
+0

你爲什麼不簡單地重定向到那個頁面?使用服務器進程中的代碼下載它意味着你*不使用相同的憑證。如果我理解正確,而不是瀏覽器(通過客戶端的憑證)訪問頁面,則不同計算機(服務器)上的另一個進程將下載並將其呈現給客戶端! – shambulator

+0

這些憑證如何提供給網頁?它使用表單身份驗證嗎? –

+0

@shambulator你是什麼意思重定向到該頁面?我正在嘗試獲取該頁面的html代碼。 – mko

回答

48

我懷疑您試圖訪問的網頁使用表單身份驗證。這意味着如果您希望能夠訪問受保護的資源,則必須提供有效的身份驗證Cookie。爲了獲得一個有效的身份驗證cookie,您必須首先通過發送POST請求到發出cookie的LogOn頁面進行身份驗證。一旦您檢索到cookie,您就可以將其隨後發送給受保護資源。您還應該注意到,開箱即用的WebClient不支持cookie。出於這個原因,你可以寫一個自定義的cookie識別Web客戶端:

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 
    public CookieContainer CookieContainer { get; private set; } 

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

現在你可以使用這個客戶端仍然發射了2個請求:

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "john" }, 
     { "password", "secret" }, 
    }; 
    client.UploadValues("http://domain.loc/logon.aspx", values); 

    // If the previous call succeeded we now have a valid authentication cookie 
    // so we could download the protected page 
    string result = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 

顯然,由於ASP.NET的ViewState的crapiness您可能需要根據您的登錄請求發送一些其他參數。以下是您可以執行的操作:在Web瀏覽器中進行身份驗證,然後使用FireBug查看需要發送的確切參數和標頭。

+0

解決方案看起來不錯,乾淨。登錄收藏的名稱是否應該是用戶名和密碼?儘管事實上是基於表單的認證,那麼應用程序是否有不同的方式來使用當前的憑證? – mko

+0

@John,我不知道登錄名是否應該是用戶名和密碼。這完全取決於你的登錄頁面是如何實現的以及它期望的參數。而且,不,沒有其他辦法。您需要獲取有效的表單身份驗證Cookie,獲取此類cookie的唯一方法是向登錄頁面提供正確的憑據。只有這個頁面(希望:-))能夠發送表單身份驗證Cookie。 –

+0

代碼不起作用,但我理解這個想法,並且我會盡力讓它起作用。 – mko