Я заметил, что существуют некоторые реальные несоответствия между браузерами с точки зрения файлов 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 указывает в спецификации файлов 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
Opera: 1 файл cookie
Firefox: 1 файл cookie
Chrome: 1 файл cookie
Как видите, и Opera, и IE устанавливают ЯВНЫЙ домен без префикса точки.
И Firefox, и Chrome ДЕЙСТВИТЕЛЬНО устанавливают домен EXPLICIT с точечным префиксом.
Если я использую следующий код:
Response.Cookies.Add(new HttpCookie("Banana", "2")
{
});
IE / Opera: Оба имеют один и тот же результат, домен БЕЗ точечного префикса.
Как ни странно, Firefox и Chrome создают файлы cookie БЕЗ префикса точки.
(Я очистил все куки и снова запустил код)
Firefox:
Chrome:
Вот тут-то и становится интересно. Если я пишу файлы 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):
Opera - установлено 2 файла cookie (браузер видит 1):
Firefox - установлено 2 файла cookie, и браузер видит 2!:
Chrome - установлено 2 файла cookie, и браузер видит 2!:
Теперь вы, вероятно, задаетесь вопросом, что это такое.
Итак:
Проблема...
Нам пришлось изменить нашу аутентификацию, чтобы указать домен в файле 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.
Который он все равно не может использовать, так как домен не возвращается на сервер вместе с куки.
Похоже, FormsAuthentication действительно не работает. Если вы используете явное доменное имя в файле cookie при аутентификации пользователя, дождитесь тайм-аута сеанса, а затем обновите страницу, метод создания файла cookie, используемый FormsAuthentication, приведет к тому, что домен будет нулевым, что заставит браузер назначить безточечный домен.
Требуется, чтобы Forms был назначен домен заранее, чтобы он был назначен файлу cookie, это нарушает мультитенантную систему...