C # ведение сеанса по HTTPS на клиенте - PullRequest
5 голосов
/ 16 ноября 2009

Мне нужно войти на сайт и выполнить действие. Веб-сайт основан на REST, поэтому я могу легко войти, выполнив это (информация для входа включена в виде строки запроса в URL, поэтому мне не нужно устанавливать учетные данные):

CookieContainer cookieJar = new CookieContainer();

HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl);
firstRequest.CookieContainer = cookieJar;
firstRequest.KeepAlive = true;
firstRequest.Method = "POST";
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse();

Это работает и регистрирует меня. Я получаю cookie для поддержки сеанса, и он сохраняется в cookieJar, показанном выше. Затем я делаю второй запрос, такой как это:

HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl);
secondRequest.Method = "POST";
secondRequest.KeepAlive = true;
secondRequest.CookieContainer = cookieJar;
WebResponse secondResponse = secondRequest.GetResponse();

И я гарантирую, что назначу куки для нового запроса. Но по какой-то причине это не работает. Я получаю сообщение об ошибке, в котором говорится, что «время сеанса истекло или истекло», и это делается один за другим, поэтому проблема не связана с синхронизацией.

Я использовал Fiddler для проверки заголовков HTTP, но считаю, что это сложно, поскольку это HTTPS. (Я знаю, что могу расшифровать, но, похоже, не очень хорошо работает.)

Я могу взять свои URL для этой службы отдыха и вставить их в Firefox, и все работает нормально, так что, должно быть, я что-то не так делаю, а не другой конец соединения.

Я не очень знаком с HTTPS. Нужно ли делать что-то еще, чтобы поддерживать мой сеанс? Я думал, что это будет файл cookie, но, может быть, есть что-то еще, что мне нужно поддерживать в двух запросах?

Вот заголовки, возвращаемые при отправке первого запроса (за исключением того, что я изменил cookie для защиты невинных!):

X-DB-Content-length=19
Keep-Alive=timeout=15, max=50
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html; charset=WINDOWS-1252
Date=Mon, 16 Nov 2009 15:26:34 GMT
Set-Cookie:MyCookie stuff goes here
Server=Oracle-Application-Server-10g

Буду признателен за любую помощь, у меня заканчиваются идеи.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Я наконец-то начал работать после расшифровки HTTP-трафика из моей программы.

Файл cookie, который я получаю, не содержит список переменных Path. Таким образом .NET берет текущий путь и назначает его в качестве пути в файле cookie, включая текущую страницу. То есть: если бы он был на http://mysite/somepath/somepage.htm, он установил бы путь cookie = / somepath / somepage.htm. Это ошибка, так как она должна быть назначена на «/», что и делают все веб-браузеры. (надеюсь, они это исправят.)

Заметив это, я взял cookie и изменил свойство пути, и теперь все работает нормально.

Кто-нибудь еще с такой проблемой, проверьте Fiddler. .NET использует хранилище сертификатов Windows, поэтому для расшифровки http-трафика из вашей программы вам необходимо выполнить следующие инструкции: http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp. Вам также необходимо включить дешифрование на вкладке «Параметры \ HTTPS» в Fiddler.

0 голосов
/ 16 ноября 2009

С MSDN :

Когда пользователь перемещается назад и вперед между защищенной и общедоступной областями, файл cookie сеанса, сгенерированный ASP.NET (или URL-адрес, если вы включили состояние сеанса без файлов cookie), перемещается вместе с ними в виде открытого текста, но файл cookie аутентификации никогда не передается через незашифрованные HTTP-соединения , если установлено свойство Secure cookie .

Таким образом, в основном, cookie может передаваться как по HTTP, так и по HTTPS, если для свойства «Secure» установлено значение «false».

см. Также как я могу поделиться сеансом asp.net между http и https

...