2009-11-16 3 views
5

Мне нужно зайти на сайт и выполнить действие. Сайт REST на базе, так что я могу легко войти в систему, делая это (данные входа в систему включен в качестве строки запроса на URL, так что я dont't необходимо установить учетные данные):C#, поддерживающий сеанс по HTTPS на клиенте

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, но, возможно, есть что-то еще, что мне нужно для поддержки двух запросов?

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

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 

Любая помощь будет оценена, я бегу из идей.

ответ

4

я, наконец, получил это работает после дешифрования HTTP трафика из моей программы.

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

После того, как я заметил это, я схватил печенье и изменил свойство пути, и теперь все работает нормально.

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

+0

Microsoft, похоже, исправила это в .NET 4. – Kelly

+0

Привет, Келли, я также столкнулся с некоторым сроком действия, который может быть похож на ваш случай выше, не могли бы вы посмотреть на эту ссылку: http://stackoverflow.com/ вопросы/22957840/crawling-session-expired – bluewonder

0

От MSDN:

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

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

смотри также how can I share an asp.net session between http and https

+0

Не уверен, что я понимаю. Я нахожусь на клиенте, а не на стороне сервера этого запроса. Мне нужно поддерживать сеанс через два или более вызовов на сервер, но даже при том, что я приношу cookie вместе с ним, похоже, не признает, что я использую тот же сеанс. – Kelly

+0

Он был немного смущен, предполагая, что сайт, на котором вы разговариваете, основан на ASP.Net, но, независимо от его предложения, нужно было установить cookie, который вы вернетесь после того, как защищенное свойство первого вызова верен, и посмотрите, работает ли это (я думаю) – John

+0

Я попробовал. Печеньки вернулись как secure = false. Я установил их для второго запроса, но все равно не повезло. – Kelly