HttpWebRequest передает учетные данные следующему HttpWebRequest

Я захожу на страницу с помощью HttpWebRequest и получаю некоторую информацию. Затем я использую эту информацию для создания нового запроса HttpWebRequest, чтобы получить дополнительную информацию. Я не хочу использовать WebClient.

Как передать учетные данные, полученные при входе в систему с использованием первого запроса HttpWebRequest, во второй?

РЕДАКТИРОВАТЬ: Если я использую CookieCollection, то это возвращается как пустой. Я только что попытался использовать WebClient в качестве крайней меры, и даже из-за того, что он не работает, второй запрос возвращает меня к экрану входа в систему. Я заметил, что в веб-браузере есть cookie.

3 ответа

Добавьте CookieContainer к каждому запросу перед его отправкой. Добавьте куки, которые вы получаете от первого ответа на второй запрос. Предполагая, что они используют куки для аутентификации, это должно аутентифицировать второй запрос.

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlWithParameters);
 request.CookieContainer = new CookieContainer();

 HttpWebResponse response = (HttpWebResponse) request.GetResponse();

 var cookies = new CookieContainer();
 cookies.Add( response.Cookies );

 request = (HttpWebRequest)WebRequest.Create(secondUrlWithParameters);
 request.CookieContainer = cookies;

 ...

Это всего лишь пример работающего кода, основанного на ответе 2. Может быть, это излишне, может проиллюстрировать кого-то.

            string url = "http://servername/place-where-data-is.extension"
            string loginUrl = "https://servername/sampleLogin?email=eeeeee&passwd=xxxxxxx";


            HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create(loginUrl);
            loginRequest.CookieContainer = new CookieContainer();
            loginRequest.Method = WebRequestMethods.Http.Get;
            HttpWebResponse loginResponse = (HttpWebResponse)loginRequest.GetResponse();
            var cookies = new CookieContainer();
            cookies.Add(loginResponse.Cookies);


            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.CookieContainer = cookies;
            request.Method = WebRequestMethods.Http.Get;

            WebResponse response = (WebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();

Это действительно старый вопрос, и я знаю, что нет WebClient но я буду публиковать здесь для всех, кто сталкивается с этим из Google. Оригинальная концепция не мой код. Я не знаю, где я его изначально нашел.

using (WebClientEx client = new WebClientEx())
{
  client.IntTimeout = intTimeout;
  client.DownloadString(strReportUrlPrefix + strReportUrlQuery);

  NameValueCollection auth = new NameValueCollection
  {
    { "j_username", strReportUsername},
    { "j_password", strReportPassword}
  };

  byte[] data = client.UploadValues(strReportUrlPrefix + "j_security_check", auth);

  // LOGIC HERE WITH DATA
}

WebClientEx Учебный класс:

public class WebClientEx : WebClient
{
  private CookieContainer _cookieContainer = new CookieContainer();
  public int IntTimeout { get; set; }

  protected override WebRequest GetWebRequest(Uri address)
  {
    WebRequest request = base.GetWebRequest(address);
    if (request != null)
      request.Timeout = IntTimeout;

    if (request is HttpWebRequest)
      (request as HttpWebRequest).CookieContainer = _cookieContainer;

    return request;
  }
}
Другие вопросы по тегам