Срок действия файла cookie при завершении сеанса браузера

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

Итак, я создал такой файл cookie:

Response.Cookies.Set(new HttpCookie("MyKey", "X"));

Но когда я закрываю браузер и затем снова его открываю, следующее выражение равно true:

Request.Cookies["MyKey"] != null

Как я могу удалить cookie, когда закончится сеанс браузера?

Примечание. Для моих целей использование статических данных вместо файла cookie кажется идеальным. Но я понимаю, что ASP.NET может перезагружаться по разным причинам, и это может вытащить ковер из-под текущего пользователя, если я потерял этот параметр.

Ответ 1

Похоже, проблема связана с описанием Stober. Вы можете установить, чтобы файл cookie истекал в конце сеанса браузера, установив для свойства HttpCookie.Expires значение DateTime.MinDate или вообще не устанавливая свойство.

Однако, по крайней мере, с настройками Chrome pick-up-where-you-left-off, похоже, что сеанс браузера не обязательно заканчивается, когда браузер закрывается. Когда он закрыт, а затем снова открывается, браузер Chrome забирает место, где он остановился, как будто сессия так и не закончилась. Это включает в себя продолжение использования файлов cookie истекает в конце сеанса.

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

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

Ответ 2

Просто установите для свойства Expires вашего экземпляра HttpCookie значение DateTime.MinDate и оно истечет после завершения сеанса браузера.

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

См. также: MSDN - Cookie.Expires Свойство

Ответ 3

Вы можете поймать это в следующем событии Session_start. Если у вас уже есть аутентифицированный пользователь сразу после начала нового сеанса, вы должны получить эту информацию из устаревшего файла cookie. Просто обнулите информацию о пользователе и позвольте переадресации входа позаботиться обо всем остальном.

Что-то вроде этого в global.asax.cs:

protected void Session_start()
{
    // starting a session and already authenticated means we have an old cookie
    var existingUser = System.Web.HttpContext.Current.User;
    if (existingUser != null && existingUser.Identity.Name != "")
    {
        // clear any existing cookies
        IAuthenticationManager authMgr = System.Web.HttpContext.Current.GetOwinContext().Authentication;
        authMgr.SignOut("MyCookieType")

        // manually clear user from HttpContext so Authorize attr works
        System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity());
    }

}
  • Код может несколько меняться в зависимости от того, как вы аутентифицируете пользователей.

См. также: