Невозможно прочитать куки в FireFox / Chrome через редирект 302, но работает в IE - PullRequest
3 голосов
/ 08 февраля 2012

Я ломаю голову, чтобы выяснить специфическую проблему браузера (в Firefox и Chrome). Я потратил так много времени, чтобы попытаться исправить эту проблему, и я наконец решил создать живую демонстрацию для экспертов, которые будут изучать эту проблему. (Надеюсь, это окупится)

У меня есть два домена www.nkmekal.com и www.incessantcoding.com

Пожалуйста, используйте Firefox / Chrome, чтобы повторить проблему:

Шаг 1:

Просмотр http://www.nkmekal.com/createcookie.aspx

Страница просто создает cookie. Ниже приведен код, который создает cookie:

    // In On_Load of nkmekal.com/createCookie.aspx
    HttpCookie cookie = new HttpCookie("DisCookie");
    cookie.Value = "djdjd77676ydjdndgdidjkdnhf";
    cookie.HttpOnly = true;
    cookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(cookie);
    lblCookieInfo.Text = string.Format("<b>Cookie Name:</b> {0} <br/><br/> <b>Cookie Value:</b> {1} <br/><br/> <b>Cookie Expires On:</b> {2}", cookie.Name, cookie.Value, cookie.Expires);

Шаг 2:

Теперь откройте новую вкладку в браузере, перейдите на http://www.incessantcoding.com/GoTonkmekal.aspx, который в основном выполняет простое перенаправление 302 на http://www.nkmekal.com/ReadCookie.aspx, ниже приведен код, который выполняет это перенаправление:

// In On_Load of incessantcoding.com/GoTonkmekal.aspx
protected void Page_Load(object sender, EventArgs e)
{
    Response.Redirect("http://www.nkmekal.com/ReadCookie.aspx");
}

Однако я вижу следующее сообщение: (см. Код страницы ReadCookie.aspx на шаге 3)

«Cookie не найдены :(»

Это означает, что домен www.nkmekal.com не смог прочитать файл cookie, созданный ранее при просмотре www.nkmekal.com / createcookie.aspx

Шаг 3:

А страница http://www.nkmekal.com/ReadCookie.aspx просто пытается прочитать созданный выше файл cookie (на шаге 1) и отображает данные файла cookie. Ниже приведен код, который пытается прочитать cookie и отображает его на странице

    // In On_Load of nkmekal/ReadCookie.aspx
    HttpCookie cookie = Request.Cookies["DisCookie"];
    if (cookie != null)
    {
      // Resetting expiry date because the browser never sends expiry date to Server,
      // as cookies expiration dates are irrelevant to servers.
      cookie.Expires = DateTime.Now.AddDays(1);
      lblCookieInfo.Text = string.Format("<b>Yes! I found a cookie</b> <br><br><b>Cookie Name:</b> {0} <br/><br/> <b>Cookie Value:</b> {1} <br/><br/> <b>Cookie Expires On:</b> {2}", cookie.Name, cookie.Value, cookie.Expires);
    }
    else
    {
        lblCookieInfo.Text = "No Cookie Found :(";
    }

Вышеуказанные шаги работают нормально только в IE, но не в FireFox / Chrome.

Кроме того, если вы хотите взглянуть на исходный код двух доменов, вы можете загрузить их по адресу

http://dl.dropbox.com/u/1248159/incessantcoding.zip

http://dl.dropbox.com/u/1248159/nkmekal.zip

Почему я пытаюсь это сделать:

Итак, причина, по которой я пытаюсь это сделать, заключается в том, что есть определенные операции, которые мне нужно выполнить в домене www.incessantcoding.com , если в www был создан файл cookie .nkmekal.com

И причина для переадресации 302 заключается в том, что мы не можем читать междоменные куки-файлы, и поэтому я пытаюсь прочитать куки-файлы только с соответствующего домена (поскольку nkmekal.com может только читать его куки).

Любая помощь / предложения будут очень полезны.

Обновление: Также весьма интересно, что если шаги 1 и 3 выполняются (без шага 2), значение cookie правильно читается в Firefox и Chrome. Только 302 не работает.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

При сохранении cookie-файла также сохраняется домен веб-сайта - это делается для того, чтобы избежать междоменного обмена данными - что означает: как только вы сохраняете cookie-файл с одного хоста, он НЕ МОЖЕТ быть прочитан с другого. .

но вы можете передать данные cookie через URL с вашего исходного хоста:

protected void Page_Load(object sender, EventArgs e)
{
    HttpCookie cookie = Request.Cookies["DisCookie"];
    if (cookie != null)
    {
         Response.Redirect("http://www.nkmekal.com/ReadCookie.aspx?data=" + cookie.Value);
    }

    else Response.Redirect("http://www.nkmekal.com/ReadCookie.aspx");
}

А затем просто используйте data в ReadCookie.aspx.

0 голосов
/ 09 февраля 2012

Я наконец-то нашел альтернативу, и она отлично работает! Вот что я сделал:

Если nkmekal.com создает DisCookie ... Я выполняю перенаправление 302 на incesscantcoding.com с зашифрованным токеном в качестве значения строки запроса, затем incessentcoding.com создаст собственный DisCookie на основе значения строки запроса для своего домена, поэтому, если я хочу узнать, существует ли файл cookie для nkmekal.com Я просто посмотрю на коллекцию Cookies для DisCookie на incessantcoding.com ... Я протестировал этот сценарий, и он, похоже, работает как в Firefox, так и в Chrome ...

И позже я понял, что даже Google делает то же самое, когда пользователь входит на один из своих сервисных веб-сайтов ...

Надеюсь, это поможет ...

...