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
Opera: 1 cookie
Firefox: 1 cookie
Chrome: 1 cookie
как вы можете видеть, как Opera и IE как задайте явный домен без префикса точки.
и Firefox, и Chrome устанавливают явный домен с префиксом точки.
если я использую следующий код:
Response.Cookies.Add(new HttpCookie("Banana", "2")
{
});
IE / Opera: оба имеют одинаковый результат, домен без префикса точки.
как ни странно, Firefox и Chrome создают куки без префикса точки.
(я очистил все куки и запустил код опять)
Firefox:
Chrome:
ИНТЕРЕСНОЕ
это где это становится интересным. Если я пишу печенье одно за другим, как так:
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):
Opera-2 cookies set (браузер видит 1):
Firefox-2 cookies set и браузер видит 2!:
Chrome-2 cookies set и браузер видит 2!:
теперь вам, вероятно, интересно, wtf все это.
хорошо:
- когда вы получаете доступ к cookie по имени в C#, он дает вам 1 cookie. (этот первый файл cookie с таким именем)
- браузер отправляет все cookies на сервер
- браузер не отправляет никакой информации, кроме ключ/значение cookie. (это означает, что сервер не заботится о домене)
- вы можете получить доступ к обоим куки с одинаковым именем, если вы получите их по индексу
проблема...
нам пришлось изменить нашу аутентификацию, чтобы указать домен в файле 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.