Вход в систему HttpWebResponse

Я пытаюсь войти в систему веб-приложение из своего приложения .NET, но по некоторым причинам оно не работает. Вот код для входа:

<form action="./process-login.php" method="post">
       <table border="0" cellpadding="5" cellspacing="0">
        <tr>
          <td>Username:</td>
          <td><input type="text" size="20" name="username" value=""></td>
        </tr>
        <tr>
          <td>Password:</td>
          <td><input type="password" size="20" name="password" value=""></td>
        </tr>
        <tr>
          <td><input type="submit" name="axn" value=Login></td>
        </tr>
      </table>
</form>

Вот то, как я делаю это от .NET:

string userName = "user";
string password = "password";

string postData = "username=" + userName;
            postData += ("&password=" + password);
            postData += ("&axn=Login");

HttpWebRequest loginRequest = (HttpWebRequest)
                WebRequest.Create("http://server.com/process-login.php");

//Added following answer begin
CookieContainer CC = new CookieContainer();
loginRequest.CookieContainer = CC;
//Added following answer end

loginRequest.Method = "POST";
loginRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*";
loginRequest.Headers.Add("Accept-Encoding: gzip,deflate");
loginRequest.Headers.Add("Accept-Language: en-us");
loginRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";

loginRequest.ContentLength = postData.Length;
loginRequest.ContentType = "application/x-www-form-urlencoded";

loginRequest.Referer = "http://server.com/login.php";
loginRequest.KeepAlive = true;

//Also added
loginRequest.AllowAutoRedirect = false;

StreamWriter newStream = new StreamWriter(loginRequest.GetRequestStream());
newStream.Write(postData);
newStream.Close();

//No cookie in the collection :-(

//Problem here, after this line loginRequest url's has changed
//it's gone back to login.php
HttpWebResponse responseLogin = (HttpWebResponse)loginRequest.GetResponse();


StreamReader stIn = new StreamReader(responseLogin.GetResponseStream());
string strResponse = stIn.ReadToEnd();
stIn.Close();

//strResponde contains the login page, still no cookie :-(

Я вхожу в систему в использовании моего браузера и согласовал со скрипачом, это - то, что я получаю для клиента:

POST http://server.com/process-login.php HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://server.com/login.php
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: server.com
Content-Length: 45
Connection: Keep-Alive
Pragma: no-cache

username=username&password=password&axn=Login

И в заголовках ответа я добираюсь:

HTTP/1.1 302 Found
Date: Thu, 20 May 2010 14:07:36 GMT
Server: Apache/2.2.3 (Unix)
Accept-Ranges: bytes
X-Powered-By: PHP/5.2.0
Set-Cookie: login=User%7C3142%7CUser+Inc.%7CAll+Orders+Discounted%7C; expires=Thu, 20-May-2010 22:07:36 GMT; domain=server.com
Set-Cookie: username=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com
Set-Cookie: password=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com
Location: /index.php
Content-Length: 0
Keep-Alive: timeout=15, max=200
Connection: Keep-Alive
Content-Type: text/html

Cookie!!!

Что я - я делающий неправильно, что я не могу получить cookie?

ОБНОВЛЕНИЕ: Добавляя код после ответа, я могу теперь получить cookie! Я открою другой вопрос, потому что кажется, что я все еще не могу получить защищенные страницы...

5
задан John Saunders 9 January 2014 в 04:06
поделиться

2 ответа

Я не вижу, что вы устанавливаете CookieContainer в веб-запросе. Можете ли вы повторить попытку, установив его?

5
ответ дан 14 December 2019 в 13:28
поделиться

Поскольку вы получаете 302, веб-запрос также автоматически запрашивает следующий URL. Вы можете отключить это, установив loginRequest.AllowAutoRedirect = false; . Как только вы это сделаете, вы должны увидеть файлы cookie. Вот документация для AllowAutoRedrect.

1
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

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