Хорошо, я слишком долго ломал голову над этим соло. Мне не удалось взломать его даже за часы, проведенные на этом и многих других сайтах.
По сути, я пытаюсь удалить некоторые данные с веб-страницы за страницей входа в систему с помощью WebRequest / Response. (Я добился того, чтобы это работало, используя элемент управления WebBrowser с некоторыми многоуровневыми событиями, которые переходят на разные веб-страницы, но это вызывает некоторые проблемы при попытке рефакторинга - не говоря уже о том, что было заявлено, что использование скрытой формы для выполнения работы это «плохая практика».)
Вот что у меня есть:
string formParams = string.Format("j_username={0}&j_password={1}", userName, userPass);
string cookieHeader;
WebRequest request = WebRequest.Create(_signInPage);
request.ContentType = "text/plain";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
request.ContentLength = bytes.Length;
using (Stream os = request.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse response = request.GetResponse();
cookieHeader = response.Headers["Set-Cookie"];
WebRequest getRequest = WebRequest.Create(sessionHistoryPage);
getRequest.Method = "GET";
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
Пока что я могу перейти на нужную страницу по первой ссылке, но когда я перехожу ко второй, она отправляет меня обратно на страница входа в систему, как если бы я не входил в систему.
Проблема может заключаться в том, что файлы cookie не собираются правильно, но я новичок, так что, возможно, я просто делаю это неправильно. Он захватывает файлы cookie, отправленные обратно из POST: JSESSIONID и S2V, однако, когда мы переходим к «GET», используя FireFox WebConsole, браузер показывает, что он отправляет JSESSIONID, S2V и SPRING_SECURITY_REMEMBER_ME_COOKIE, что я считаю это файл cookie, который используется, когда я нажимаю поле «Запомнить меня» в форме входа в систему.
Я пробовал много разных способов сделать это, используя ресурсы SO, но мне еще предстоит добраться до нужной мне страницы.Итак, ради оставленных у меня волос я решил попросить помощи на хорошем оле SO. (Это одна из тех вещей, от которых я не хочу отказываться - иногда такая упрямая)
Если кому-то нужен реальный адрес сайта, на который я пытаюсь войти, я бы больше чем счастлив отправить его паре человек в личном сообщении.
Код, в котором я должен отразить предложенный ответ Уолла:
var request = (HttpWebRequest)WebRequest.Create(sessionHistoryPage);
request.Credentials = new NetworkCredential(userName, userPass);
request.CookieContainer = new CookieContainer();
request.PreAuthenticate = true;
WebResponse getResponse = request.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
Это предложение, по крайней мере, так, как я его реализовал, не сработало.
Как предложил Кризз, я изменил код, чтобы использовать CookieContainer и передавать файлы cookie из одного запроса в другой, однако ответ просто возвращает мне исходную страницу входа, как если бы я не входил в систему.
Существуют ли определенные сайты, на которых такое поведение ЗАПРЕЩАЕТСЯ?
Окончательное решение
Окончательное решение было предложено Адрианом Ифтоде, где он заявил, что веб-сайт, на который я пытаюсь войти , может не разрешать аутентификацию без действующего сеанса , поэтому добавление GET в начало процесса позволило мне получить этот файл cookie.
Спасибо за вашу помощь, ребята!