Задать вопрос

Почему не работает второй POST запрос в C#?

Суть: есть django приложение, в котором нужно авторизоваться.

Как я это делаю:
1. Посылаю первый get запрос на login url для получения csrfmiddlewaretoken
2. Посылаю post запрос на тот же url, в качестве cookie и post data отправляю этот самый токен, а также в post data добавляю данные пользователя.
3. В итоге проверяю: если произошёл редирект - авторизация была успешной

Как я это сделал в питоне и это заработало:
import urllib2

main_page_request = requests.get('http://carkit.kg/')
csrf_cookie = main_page_request.cookies.get('csrftoken', '')

r = requests.post('http://carkit.kg/', data={u'username': u'admin', u'password': u'admin', 'csrfmiddlewaretoken': csrf_cookie }, cookies={'csrftoken': csrf_cookie})
print r.url


Как я это сделал в C# и это не работает, выкидывая на втором запросе request timed out:

HttpWebRequest tokenRequest = (HttpWebRequest)WebRequest.Create("http://carkit.kg");
tokenRequest.CookieContainer = new CookieContainer();
String token = ((HttpWebResponse)tokenRequest.GetResponse()).Cookies["csrftoken"].ToString().Split('=')[1];

HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("http://carkit.kg");

var cache = new CredentialCache();
cache.Add(new Uri("http://carkit.kg/"), "Digest", new NetworkCredential(tempEmail, tempPass));
loginRequest.Credentials = cache;
loginRequest.PreAuthenticate = true;

loginRequest.Method = "POST";
loginRequest.CookieContainer = new CookieContainer();
loginRequest.CookieContainer.Add(new Cookie("csrftoken", token, "/", "carkit.kg"));

byte[] data = Encoding.ASCII.GetBytes("username=" + tempEmail + "&password=" + tempPass + "&csrfmiddlewaretoken=" + token);
loginRequest.ContentLength = data.Length + 1;
loginRequest.Timeout = 3000;
loginRequest.Headers.Add("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(tempEmail + ":" + tempPass)));
loginRequest.GetRequestStream().Write(data, 0, data.Length);
Debug.Log(loginRequest.Headers.ToString());
// вот здесь выкидывает request timed out
HttpWebResponse authResponse = (HttpWebResponse)loginRequest.GetResponse();
Debug.Log(authResponse.ResponseUri);


Хочу, чтобы работало в C#. Как это сделать?
  • Вопрос задан
  • 496 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы