C # поддерживает сеанс через HTTPS на клиенте

Мне нужно войти на сайт и выполнить действие. Веб-сайт основан на 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();

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

Я использовал 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

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


person Kelly    schedule 16.11.2009    source источник


Ответы (2)


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

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

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

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

person Kelly    schedule 16.11.2009
comment
Похоже, что Microsoft исправила это в .NET 4. - person Kelly; 29.06.2010
comment
Привет, Келли, у меня истек срок действия сеанса, который может быть похож на ваш случай выше. Не могли бы вы взглянуть на эту ссылку: stackoverflow.com/questions/22957840/crawling-session-expired Спасибо - person bluewonder; 09.04.2014

Из MSDN:

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

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

см. также https://stackoverflow.com/questions/567535/how-can-i-share-an-asp-net-session-between-http-and-https

person Manu    schedule 16.11.2009
comment
Не уверен, что понимаю. Я нахожусь на стороне клиента, а не на стороне сервера этого запроса. Мне нужно поддерживать сеанс через два или более вызовов к серверу, но даже несмотря на то, что я беру с собой файл cookie, он, похоже, не распознает, что я использую тот же сеанс. - person Kelly; 16.11.2009
comment
Он был немного сбит с толку, предполагая, что сайт, с которым вы разговариваете, основан на ASP.Net, но, несмотря на то, что его предложение состояло в том, чтобы установить для cookie, который вы возвращаете после безопасного свойства первого вызова, значение true и посмотреть, работает ли это (я думаю) - person John; 16.11.2009
comment
Я попробовал. Куки вернулись как secure = false. Я установил для них значение true для второго запроса, но все равно не повезло. - person Kelly; 16.11.2009