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;
}
}