4

我必須從安全站點刮取表格,並且無法登錄到頁面並檢索身份驗證令牌和任何其他關聯的Cookie。我在這裏做錯了什麼?嘗試使用HttpWebRequest獲取身份驗證Cookie

public NameValueCollection LoginToDatrose() 
{ 
    var loginUriBuilder = new UriBuilder(); 
    loginUriBuilder.Host = DatroseHostName; 
    loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE); 
    loginUriBuilder.Scheme = "https"; 

    var boundary = Guid.NewGuid().ToString(); 
    var postData = new NameValueCollection(); 
    postData.Add("LoginName", DatroseUserName); 
    postData.Add("Password", DatrosePassword); 

    var data = Encoding.ASCII.GetBytes(postData.ToQueryString(false)); 
    var request = WebRequest.Create(loginUriBuilder.Uri) as HttpWebRequest; 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = data.Length; 
    using (var d = request.GetRequestStream()) 
    { 
     d.Write(data, 0, data.Length); 
    } 

    var response = request.GetResponse() as HttpWebResponse; 
    var responseCookies = new NameValueCollection(); 
    foreach (var nvp in response.Cookies.OfType<Cookie>()) 
    { 
     responseCookies.Add(nvp.Name, nvp.Value); 
    } 

    //using (var responseData = response.GetResponseStream()) 
    //using (var responseReader = new StreamReader(responseData)) 
    //{ 
    // var theResponse = responseReader.ReadToEnd(); 
    // Debug.WriteLine(theResponse); 
    //} 

    return responseCookies; 

} 

我在返回對象中沒有得到任何值。它不會失敗。 theResponse(未註釋掉)的值似乎是登錄頁面的HTML。

任何援助將不勝感激。

回答

10

好的,這裏的問題似乎與在證書通過後發生的302重定向有關。該HttpWebRequest將自動跟隨302.

最終,我做了一些不同的事情。首先,我子類的WebClient類,如下所示:

public class CookiesAwareWebClient : WebClient 
{ 
    private CookieContainer outboundCookies = new CookieContainer(); 
    private CookieCollection inboundCookies = new CookieCollection(); 

    public CookieContainer OutboundCookies 
    { 
     get 
     { 
      return outboundCookies; 
     } 
    } 
    public CookieCollection InboundCookies 
    { 
     get 
     { 
      return inboundCookies; 
     } 
    } 

    public bool IgnoreRedirects { get; set; } 

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

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse response = base.GetWebResponse(request); 
     if (response is HttpWebResponse) 
     { 
      inboundCookies = (response as HttpWebResponse).Cookies ?? inboundCookies; 
     } 
     return response; 
    } 
} 

這讓我使用WebClient類是餅乾感知以及一個我能控制的重定向。然後我重寫我的代碼登錄如下:

public NameValueCollection LoginToDatrose() 
{ 
    var loginUriBuilder = new UriBuilder(); 
    loginUriBuilder.Host = DatroseHostName; 
    loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE); 
    loginUriBuilder.Scheme = "https"; 

    var postData = new NameValueCollection(); 
    postData.Add("LoginName", DatroseUserName); 
    postData.Add("Password", DatrosePassword); 

    var responseCookies = new NameValueCollection(); 

    using (var client = new CookiesAwareWebClient()) 
    { 
     client.IgnoreRedirects = true; 
     var clientResponse = client.UploadValues(loginUriBuilder.Uri, "POST", postData); 
     foreach (var nvp in client.InboundCookies.OfType<Cookie>()) 
     { 
      responseCookies.Add(nvp.Name, nvp.Value); 
     } 
    } 

    return responseCookies; 
} 

...一切都很順利。

+3

您可以使用httpwebrequest,它具有allowredirect屬性。你可以設置false; – kuhajeyan 2013-07-17 19:01:17

相關問題