Cookies с указанным доменом и без него (несоответствие браузера)

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

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

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

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

Википедия

Википедия утверждает, что:http://en.wikipedia.org/wiki/HTTP_cookie#Domain_and_Path

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

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

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

});

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

W3

W3 заявляет в спецификации для cookies:http://www.w3.org/Protocols/rfc2109/rfc2109

домен=домен

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

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

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 устанавливают явный домен с префиксом точки.

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

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

});

IE / Opera: оба имеют одинаковый результат, домен без префикса точки.

как ни странно, Firefox и Chrome создают куки без префикса точки.

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

Firefox:

Firefox with 1 cookie and domain explicitly set

Chrome:

Chrome with 1 cookie and domain explicitly set

ИНТЕРЕСНОЕ

это где это становится интересным. Если я пишу печенье одно за другим, как так:

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

});

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

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

в IE / Opera последний набор файлов cookie-это файл cookie это используется. Это связано с тем, что имя Cookie и доменное имя идентичны.

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

Chrome и Firefox с другой стороны, см. Более 1 cookie:

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

<script type="text/javascript">

(function () {
    var cookies = document.cookie.split(';');
    var output = "";

    for (var i = 0; i < cookies.length; i++) {
        output += "<li>Name " + cookies[i].split('=')[0];
        output += " - Value " + cookies[i].split('=')[1] + "</li>";
    }

    document.write("<ul>" + output + "</ul>");
})();

</script>

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

IE - 2 cookies set (браузер видит 1):

IE - 2 cookies set, the outcome

Opera-2 cookies set (браузер видит 1):

enter image description here

Firefox-2 cookies set и браузер видит 2!:

enter image description here

Chrome-2 cookies set и браузер видит 2!:

enter image description here


теперь вам, вероятно, интересно, wtf все это.

хорошо:

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

проблема...

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

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

даже tho есть два куки, первый из которых извлекается, который оказывается старым, аутентификация не выполняется, пользователь не вошел в систему. Иногда правильный файл cookie является первым в списке, а аутентификация преуспевает...

Первоначально мы решили это, нажав cookie со старым доменом, чтобы истечь его. Это работает в Chrome и Firefox.

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

мой вывод заключается в том, что домен на cookie является полной пустой тратой времени.

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

обновление:

копание в том, как .NET подписывает пользователя.

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

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

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

обновление 2

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

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

2 ответов


предложение@WilliamBZA помогло решить начальную проблему, но затем ошибка signout/Session timeout, которая приводит к созданию файла cookie неявного домена, заставила меня прийти к выводу, что решение есть...

Не используйте явные куки в .NET ... когда-либо

существует слишком много проблем, уверен, что они могут быть решены, будучи явными в форме / домене, Cookie / Domain и т. д. Чтобы убедиться, что используется правильный домен повсюду. Но если ваше приложение содержит несколько доменов или является многопользовательским, то это становится слишком проблематичным.

урок усвоил. Не используйте явные cookies.


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

в случае проверки подлинности форм измените имя файла cookie ASPXAUTH.