2013-07-19 6 views
11

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

Так что я создал печенье, как это:

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

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

Request.Cookies["MyKey"] != null 

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

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

+0

вы хотите, чтобы куки на сервере истекают после завершения сеанса браузера ли? Как вы проверяете значение 'Request.Cookies [« MyKey »]' после закрытия браузера? – Stobor

+0

Я хочу, чтобы файл cookie был на клиенте, а не на сервере. Я проверяю значение файла cookie после закрытия браузера при повторном открытии браузера и перезагрузке страницы. –

+0

Любопытно, если в игре есть недокументированное значение по умолчанию - поместите точку останова на или после 'Response.Cookies.Add' и проверьте текущие значения установленного файла cookie, чтобы убедиться, что истечение установлено (или не установлено), как ожидалось. Кроме того, проверьте фактический файл cookie в своем браузере, чтобы убедиться, что срок годности установлен (или не установлен), как и ожидалось там. –

ответ

15

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

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

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

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

0

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

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

Смотрите также: MSDN - Cookie.Expires Property

+0

Установка даты истечения срока действия в 'DataTime.MinDate' имеет тот же эффект, что и установка даты истечения срока действия. В Chrome (по крайней мере, с некоторыми настройками) это означает, что cookie не истекает, когда сеанс браузера заканчивается. (Или, по крайней мере, «сеанс браузера» не заканчивается, когда браузер закрыт.) –

0

Вы можете поймать это на следующем мероприятии 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()); 
    } 

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

Смотрите также: