Подтвердить что ты не робот

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

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

Это будет довольно длинным, так голым со мной.

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

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

Wikipedia

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

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

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

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

});

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

W3

Состояние W3 в спецификации для файлов cookie: http://www.w3.org/Protocols/rfc2109/rfc2109

= Домен домена

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

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

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

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

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

Домен по умолчанию для узла-запроса. (Обратите внимание, что нет точки в начало запроса-хоста.)


Со мной до сих пор?

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

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

Оба Firefox и Chrome DO устанавливают для домена EXPLICIT префикс точки.

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

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

});

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

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

(я удалил все файлы 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 LAST является используемым файлом cookie. Это связано с тем, что имя файла cookie и имя домена идентичны.

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

Chrome и Firefox, с другой стороны, см. более одного файла 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 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


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

Ну:

  • Когда вы получаете доступ к файлу cookie по имени в С#, он дает вам 1 файл cookie. (первый файл cookie, который имеет это имя).
  • Браузер отправляет ВСЕ файлы cookie на сервер
  • Браузер не передает информацию, отличную от ключа/значения cookie. (это означает, что сервер не заботится о домене)
  • Вы можете получить доступ к файлам 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.

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

Обновление 2

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

Для этого требуется, чтобы Forms был назначен домен вверх, чтобы он был назначен куки файлу, это разбивает систему с несколькими арендаторами...

4b9b3361

Ответ 1

Предложение

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

Не использовать Явные файлы cookie в .NET... ever

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

Урок изучен. Не используйте явные куки файлы.

Ответ 2

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

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