Как правильно истечь срок действия куки?

У нас есть веб-сервис, в который пользователи могут входить и выходить. Файл cookie используется для определения того, вошел ли пользователь в систему или нет.

Служба предоставляет несколько «сайтов», каждый из которых идентифицируется субдоменом. Например:

  • http://customer1.ourservice.com/
  • http://customer2.ourservice.com/

Есть два способа войти в систему; либо «для всего сервиса», либо «для конкретного сайта».

Запросы на вход для всего сервиса отправляются на специальный поддомен (http://globalauth.ourservice.com/). Такие запросы на вход приводят к заголовку Set-Cookie, подобному следующему:

Set-Cookie: OUR-COOKIE=<<cookie-value>>; 
            expires=Wed, 03 May 2017 11:25:58 GMT; 
            domain=.ourservice.com; 
            path=/; 
            httponly

(Разрывы строк добавлены здесь для облегчения чтения)

Параметр domain=.ourservice.com делает файл cookie доступным для всех субдоменов.

Запросы на вход для конкретного сайта отправляются на поддомен конкретного сайта. Они приводят к заголовку Set-Cookie, подобному следующему:

Set-Cookie: OUR-COOKIE=<<cookie-value>>; 
            expires=Wed, 03 May 2017 11:23:42 GMT; 
            path=/; 
            httponly

Запросы на выход всегда отправляются на поддомен конкретного сайта и должны удалять файлы cookie как для «бокового» входа, так и для входа «для конкретного сайта».

Запрос на выход приводит к заголовку Set-Cookie, подобному следующему:

Set-Cookie: OUR-COOKIE=; 
            expires=Mon, 02 May 2016 11:26:54 GMT; 
            path=/; 
            httponly,
            OUR-COOKIE=; 
            expires=Mon, 02 May 2016 11:26:54 GMT; 
            domain=.ourservice.com; 
            path=/; 
            httponly

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

Он работает, когда используется вход «для всей службы», но не работает, когда используется вход для конкретного сайта.

Файл cookie для конкретного сайта просто не удаляется из браузера.

Как мы должным образом проинструктируем браузер об истечении срока действия/удалении файла cookie независимо от того, был ли он выпущен с настройкой domain или нет?


person Mårten Wikström    schedule 03.05.2016    source источник


Ответы (1)


Оказывается, это связано с ошибкой, связанной с WCF, в .NET framework 4.0 и 4.5.

Спецификация RFC 6265 не позволяет передавать несколько файлов cookie, разделенных запятыми, в одном Set-Cookie заголовок. Вместо этого следует использовать несколько заголовков Set-Cookie (по одному для каждого файла cookie).

Мы используем HttpResponseHeadersExtensions.AddCookies для добавления файлов cookie. В документации по этому методу четко сказано:

Каждый заголовок Set-Cookie представлен как один экземпляр CookieHeaderValue.

Однако оказывается, что несколько экземпляров CookieHeaderValue действительно объединены в один заголовок Set-Cookie, разделенный запятыми, который не поддерживается спецификацией.

См. следующие связанные сообщения на StackOverflow:

Цитата из последнего поста:

Тот факт, что «Set-Cookie» помещается в одну строку cookie, регистрируется как ошибка в Microsoft для .NET Framework 4.0, а также Framework 4.5. В группе разработчиков Microsoft WCF ошибка указана как «закрытая» и «не исправимая».

По словам Microsoft, единственным обходным путем является переход с собственного хостинга на хостинг в IIS, а затем непосредственное использование объекта (IIS) Response (другой путь кода, в котором нет ошибки).

Это плохая новость для нас, так как в настоящее время мы привязаны к использованию пути кода собственного хоста. Нам нужно найти способ обойти эту ошибку.

person Mårten Wikström    schedule 04.05.2016