Файлы cookie с указанным доменом и без него (несовместимость браузера)

Я заметил, что существуют некоторые реальные несоответствия между браузерами с точки зрения файлов cookie.

Это будет довольно долго, так что потерпите.

Примечание:Я установил домен в своем файле хоста под названием «testdomain.com», эта ошибкаНЕ работает при использовании «localhost».

Note2:Мне любопытно узнать, как это работает на Apache/PHP, если при извлечении файла cookie по имени он возвращает коллекцию файлов cookie.

Википедия

В Википедии указано, что: http://en.wikipedia.org/wiki/HTTP_cookie#Domain_and_Path

Домен и путь
Домен и путь файла cookie определяют область действия файла cookie. куки — они сообщают браузеру, что куки должны быть отправлены только обратно сервер для данного домена и пути. Если не указано иное, они по умолчанию домен и путь запрошенного объекта.

Итак, если мы нажмем:

Response.Cookies.Add(new HttpCookie("Banana", "2")
{

});

Мы должны получить cookie с используемым доменом, являющимся доменом из запрошенного объекта, в данном случае это должен быть "testdomain.com".

W3

W3 указывает в спецификации файлов cookie: http://www.w3.org/Protocols/rfc2109/rfc2109

Домен=домен

Необязательно. Атрибут Domain указывает домен, для которого куки действительны. Явно указанный домен всегда должен начинаться с точкой.

Итак, если мы нажмем:

Response.Cookies.Add(new HttpCookie("Banana", "1")
{
    Domain = Request.Url.Host
});

Мы нажмем имя хоста явно, мы должны получить доменное имя, установленное в файле cookie, с префиксом в виде точки, в данном случае это должно быть «.testdomain.com». ".

В нем также указано, что есть в Википедии:

По умолчанию домен — это request-host. (Обратите внимание, что нет точки в начало запроса-хоста.)


Со мной так далеко?

Если я использую первый метод определения домена:

Response.Cookies.Add(new HttpCookie("Banana", "1")
{
    Domain = Request.Url.Host
});

Вот результаты:

IE9: 1 файл cookie

IE with 1 cookie and domain explicitly set

Opera: 1 файл cookie

Opera with 1 cookie and domain explicitly set

Firefox: 1 файл cookie

Firefox with 1 cookie and domain explicitly set

Chrome: 1 файл cookie

Chrome with 1 cookie and domain explicitly set

Как видите, и Opera, и IE устанавливают ЯВНЫЙ домен без префикса точки.

И Firefox, и Chrome ДЕЙСТВИТЕЛЬНО устанавливают домен EXPLICIT с точечным префиксом.

Если я использую следующий код:

Response.Cookies.Add(new HttpCookie("Banana", "2")
{

});

IE / Opera: Оба имеют один и тот же результат, домен БЕЗ точечного префикса.

Как ни странно, Firefox и Chrome создают файлы cookie БЕЗ префикса точки.

(Я очистил все куки и снова запустил код)

Firefox:

Firefox with 1 cookie and domain explicitly set

Chrome:

Chrome with 1 cookie and domain explicitly set

ИНТЕРЕСНО

Вот тут-то и становится интересно. Если я пишу файлы cookie один за другим, например, так:

Response.Cookies.Add(new HttpCookie("Banana", "1")
{
    Domain = Request.Url.Host
});
Response.Cookies.Add(new HttpCookie("Banana", "2")
{

});

ЛИЧНО я ожидаю, что в браузере будет существовать один файл cookie, потому что я предполагаю, что он основан на имени файла cookie.

Вот что я заметил:

В IE/Opera используется ПОСЛЕДНИЙ набор файлов cookie. Это связано с тем, что имя файла cookie и доменное имя идентичны.

Если вы явно определяете доменное имя с точкой, оба браузера все равно будут видеть 1 файл cookie, последний файл cookie с тем же именем.

Chrome и Firefox, с другой стороны, видят более 1 файла cookie:

Я написал следующий код JavaScript для вывода значений на страницу:


Вот результаты:

IE — установлено 2 файла cookie ( браузер видит 1):

IE - 2 cookies set, the outcome

Opera - установлено 2 файла cookie (браузер видит 1):

enter image description here

Firefox - установлено 2 файла cookie, и браузер видит 2!:

enter image description here

Chrome - установлено 2 файла cookie, и браузер видит 2!:

enter image description here


Теперь вы, вероятно, задаетесь вопросом, что это такое.

Итак:

  1. Когда вы обращаетесь к файлу cookie по имени в C#, он дает вам 1 файл cookie. (первый файл cookie с таким именем)
  2. Браузер отправляет ВСЕ файлы cookie на сервер.
  3. Браузер не отправляет никакой информации, кроме ключа/значения файла cookie. (это означает, что сервер не заботится о домене)
  4. Вы можете получить доступ к обоим файлам cookie с одним и тем же именем, если вы извлекаете их по индексу

Проблема...

Нам пришлось изменить нашу аутентификацию, чтобы указать домен в файле cookie, когда мы нажимали его.

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

Несмотря на наличие двух куки-файлов, извлекается первый, который оказался старым, аутентификация не удалась, пользователь не вошел в систему. ИНОГДА правильный куки-файл находится первым в списке, и аутентификация проходит успешно...

Сначала мы решили эту проблему, отправив файл cookie со старым доменом для истечения срока его действия. Это работало в Chrome и Firefox.

Но теперь это сломало IE/Opera, так как оба браузера не заботятся о домене и сравнивают cookie только на основе имени.

Я пришел к выводу, что домен в файле cookie — пустая трата времени.

Предполагая, что мы должны указать домен, и мы не можем полагаться на то, что пользователи будут очищать кеш своего браузера. Как мы можем решить эту проблему?

Обновление:

Изучение того, как .NET выходит из системы.

if (FormsAuthentication._CookieDomain != null)
{
    httpCookie.Domain = FormsAuthentication._CookieDomain;
}

Похоже, что проверка подлинности с помощью форм вполне может отправить файл cookie с истекшим сроком действия, который совершенно не связан с файлом cookie, с помощью которого аутентифицируется пользователь. Он не использует текущий домен Auth Cookie.

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

Обновление 2

Похоже, FormsAuthentication действительно не работает. Если вы используете явное доменное имя в файле cookie при аутентификации пользователя, дождитесь тайм-аута сеанса, а затем обновите страницу, метод создания файла cookie, используемый FormsAuthentication, приведет к тому, что домен будет нулевым, что заставит браузер назначить безточечный домен.

Требуется, чтобы Forms был назначен домен заранее, чтобы он был назначен файлу cookie, это нарушает мультитенантную систему...

44
задан Flimzy 6 June 2018 в 07:35
поделиться