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

相关问题