Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемма с сессией и куки  (Прочитано 10384 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 17-03-2008 11:29 » 

Всем доброго времени суток!

Есть сайт на ASP.NET в странице есть фрейм, который ссылается на WPF страничку XBAP на которой лежит кнопочка. XBAP лежит на том же сайте что и ASP.NET сайт. XBAP ясен перец выполняется на стороне клиента. При нажатии на кнопочку XBAP (который работает на стороне клиента) пытается с помощью WebService получить данные от ASP.NET Service который лежит там же где и сайт. Код выглядит вот так:

                WSTestWebService.TestWebService srvc = new WSTestWebService.TestWebService();

                //Пытаемся запихать в сервис кукесы
                string cookieHeader2 = Application.GetCookie(new Uri("http://mySite/myPage.aspx"));
                string[] cookies = cookieHeader2.Split(new char[] { ';' });
                srvc.CookieContainer = new CookieContainer();
                if (cookies != null && cookies.Length > 0)
                    foreach (string s in cookies) {
                        string[] vals = s.Split(new char[] { '=' }, 2);
                        if (vals != null && vals.Length > 1) {
                            Cookie cook = new
                                Cookie(
                                vals[0].Replace(" ", null).Replace("\t", null).Replace("\r", null).Replace("\n", null).Replace("=", null).Replace(";", null).Replace(",", null),
                                vals[1].Replace(";", null).Replace(",", null));
                            MessageBox.Show(cook.Name + "-------" + cook.Value);
                            cook.Path = "/";
                            srvc.CookieContainer.Add(new Uri(srvc.Url), cook);
                        }
                    }

                srvc.Credentials = CredentialCache.DefaultCredentials;
                label1.Content = srvc.HelloWorld();

Проблема вот в чем: Клиент заходит на ASP.NET сайт, проходит авторизацию, открывает окошко с фреймом в котором лежит многострадальный XBAP, нажимает на кнопочку, XBAP обращается к сервису на сайт, но сайт думает что авторизация не пройдена и редиректит на страницу авторизации. Добрые люди сказали что нужно скопировать куки из канала ASP страницы в канал сервиса, я вроде скопировал (см. код выше), но толи так криво скопировал, толи еще что, сервер редиректит вызов метода из вебсервиса на страницу авторизации. С ума сойти...

Веб сервис выглядит так:

using System.Web.Services;

/// <summary>
/// Summary description for TestWebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestWebService : WebService {

    [WebMethod(Description = "Запрос данных", EnableSession = true)]
    public string HelloWorld() {
        return "Hello World";
    }
}
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-03-2008 19:08 » 

USBLexus, посмотри о куки: http://club.shelek.ru/viewart.php?id=264 (начиная со слов "Вернемся к Куки и сессии."). Т.к. отсылкой куки занимается клиент, то от языка логика не зависит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 18-03-2008 11:12 » 

Почитал, расширил кругозор, интересная статья, спасибо!
Самое интересное что поставил только что FireFox а там мой код работает, но не работает в IE7, все описанные выше проблемы возникают только в IE7
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 18-03-2008 18:06 » 

USBLexus, погоди, тема о серверном asp.net? Причем тогда браузер?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 19-03-2008 05:47 » 

Ну я сам пока не сильно в теме, только начинаю разбираться, но судя по всему разные браузеры с куки работают по разному
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 20-03-2008 04:02 » 

Посмотрел трафик снифером, HTTP запрос вызова веб сервиса из XBAPа передается без куки, хотя я куки заполнил (см. код выше), не могу победить(((
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-03-2008 08:03 » 

а сами куки есть?
если в ФФ работает, значит куки сохраняются
а в ИЕ?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 20-03-2008 08:58 » 

Нашел ошибку куки привязывались на другой адрес поэтому IE их не видел, поправил код теперь куки есть, только вот не пойму - судя по сниферу с одним и тем же кодом, когда конектишься через FireFox в куки есть Id сессии, когда конектишься через ie куки точно такие - же как у фф, только без Id сессии((( Поэтому ASP сайт редиректит на логинпейдж, понять не могу почему ie съедает id сессии в куки...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-03-2008 10:42 » 

USBLexus, процесс такой:

1. Клиент обращается первый раз или куки было просроченное и клиент его удалил.

Запрос: без куки.
Ответ: сервер сообщает куки.

2. Нормальный процесс, когда куки есть и не просроченное.

Запрос: передается ранее полученные куки.
Ответ: без упоминания куки.

3. Процесс, когда куки есть, но сервер посчитал, что его надо удалить (например logout)

Запрос: передается ранее полученные куки.
Ответ: удаление куки.

Это все на уровне HTTP + серверное ПО.
« Последнее редактирование: 20-03-2008 10:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #9 : 20-03-2008 11:09 » 

В общем как мне удалось выяснить id сессии это protected куки и разные браузеры работают с ним по разному. Не знаю правильно это или нет, создал обычный куки на сервере, в него положил Id сессии, на клиенте смотрю пришел ли ASP.NET_session_id, если не пришел то просто переименовываю свой куки в ASP.NET_session_id и отправляю на сервер вместе с сервисом.
Извратно конечно, но зато работает и в фф и в ие
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 20-03-2008 21:08 » 

USBLexus, в протоколе нет понятия "id сессии". Есть только cookie и их может быть несколько штук сразу, и каждое cookie может иметь свои настройки домен/путь/ttl/защита.

Если и есть какие-либо зависимости, то ищи их в самом ASP.
« Последнее редактирование: 20-03-2008 21:10 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 27-03-2008 11:21 » 

Странная тема. Браузеры, сервисы, сайты, куки...

Начинать надо с архитектуры всей этой системы.

Как я понял:
1) Есть клиент (браузер), обращающийся к сайту.
2) Сайт авторизует подключившегося к нему клиента.
3) Сайт (ASP.NET) выдаёт фрейм, в котором запускается XBAP.
4) XBAP обращается к веб-сервису.

Где авторизация пользователя в XBAP?
Где авторизация XBAP, обращающегося к веб-сервису?

Пользователь авторизуется "сквозным" образом во всех взаимодейтсвующих частях или только на frontend-сайте, нужна ли аутентификация пользователя в XBAP и веб-сервисе? Если нужна, как обеспечить автоматическую передачу аутентификационной информаци от frontend-сайта к другим частям системы?

Вот когда это всё разрешится, тогда станет понятна роль cookie и всего прочего, а также существенные особенности браузеров.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines