Можно ли понять успешный вход в систему на основе полученных файлов cookie? - PullRequest
0 голосов
/ 25 декабря 2008

Я занимаюсь разработкой приложения на C #, которое делает это (кстати, это тоже мое первое приложение на C #):

  • получает логин от пользователя (id, pass),
  • открывает новое HttpWebRequest подключение к веб-странице ASP.NET
  • пытается войти на эту страницу с полученным кортежем [id, pass]. Если вход выполнен успешно, мой HttpWebRequest объект содержит cookie, который будет использоваться для входа на другую страницу.

Прежде чем запрашивать вторую (защищенную) страницу, я хочу убедиться, что первый вход в систему прошел успешно. Сначала я подумал, что сервер отправляет cookie, только если вход в систему успешен. Но это не так. :) Можно ли из полученного объекта cookie понять, что мой вход в систему успешен? Или есть другие способы, которые вы можете предложить мне для решения этой проблемы?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 26 декабря 2008

Спасибо за все ответы. Вот мое странное решение. :) Я пишу это, потому что кому-то это может понадобиться в будущем.

Файл cookie, который я получаю, не содержит определенной пары [имя, значение], например [logged, true]. Единственное, что я получаю, это что-то вроде:

Set-Cookie: ASP.NET_SessionId=ah0b2kj40oi0vuufv0mmot35; path=/; HttpOnly\r\n

Итак, я подумал, что нахожусь не в том направлении, и попытался найти другой способ анализа, если вход успешен или нет. Мое решение состоит в том, чтобы использовать StatusCode ответа. Я понял, что (спасибо комментарию Джейсона о коде ошибки 401) сервер отвечает HTTP 302 Найденный код состояния, если вход выполнен успешно. Но если вход в систему неудачен, он отвечает с той же самой страницей входа (то есть HTTP 200 OK). Поэтому в зависимости от полученного HTTP-кода ответа я решаю, успешен он или нет. Вот пример кода:

//In LoginForm.cs
if (((HttpWebResponse)request.GetResponse()).StatusCode.ToString().Equals("Found"))
            {
                    nextUrl = ((HttpWebResponse)request.GetResponse()).Headers.Get(4);
                    StringBuilder FullUrl = new StringBuilder(this.server_address);
                    FullUrl.Append(nextUrl);
                    this.setSecretURL(FullUrl.ToString());

                    setLoginSuccess(true);
                    // now we can send out cookie along with a request for the protected page
                    request = WebRequest.Create(SECRET_PAGE_URL) as HttpWebRequest;
                    request.CookieContainer = cookies;
                    StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());

                    // and read the response
                    result = responseReader.ReadToEnd();
                    responseReader.Close();

     } else 
     {
          setLoginSuccess(false);                   
     }
1 голос
/ 25 декабря 2008

, если пользователь не авторизован, веб-сервер должен вернуть код ошибки HTTP 401

0 голосов
/ 25 декабря 2008

Я бы сделал одну из двух вещей.

  1. Вместо использования страницы aspx я мог бы использовать веб-сервис. Метод входа в веб-службу вернет xml-ответ, который сообщит вам, был ли вход успешным, в дополнение к предоставлению вам файла cookie. (Некоторые StackOverflowers могут не соглашаться с использованием файлов cookie с веб-сервисами, но они мне нравятся.)

  2. Ваша страница входа может быть скорее API. Допустим, ваш URL выглядит так:

    http://mywebsite.com/api.aspx?method=login&userid=sampleuser&password=password

    В ответном html вы можете отправить обратно анализируемое сообщение, которое может быть либо просто текстом, либо xml. Например, страница результатов может просто сказать «успех». Ваше приложение c # может прочитать это и увидеть, что вы успешно вошли в систему.

    Примечание. Возможно, вы захотите отправить имя пользователя и пароль по запросу POST и, возможно, хэшировать пароль перед отправкой.

Удачи!

...