2010-06-09 4 views
5

Я использую состояние сеанса ASP.NET для отслеживания входа в систему на моем сайте.Изменение срока действия файла cookie состояния ASP.NET

Тем не менее, одна проблема, с которой я столкнулся, заключается в том, что по умолчанию cookie сеанса ASP.NET истекает, когда браузер закрывается.

http://ahb.me/43e

Я попытался установить свою собственную ASP.NET_SessionId печенье и модифицирования истечение печенья, используя что-то подобное следующему коду:

Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(1); 

Ни один из этих подходов не работают, все они устанавливают второй файл cookie с тем же именем.

Есть ли способ изменить срок действия сеанса cookie?

ответ

2

Я предлагаю вам использовать FormsAuthentication для отслеживания зарегистрированных пользователей. Вы можете использовать постоянный FormsAuthenticationCookie для достижения того, чего хотите.

Или, если вы действительно хотите использовать состояние сеанса, попробуйте this technique.

+0

Подход FormsAuthCookie позволяет пользователям пропускать регистрацию форм, если они повторно подключаются в течение определенного временного окна. Он не поддерживает какое-либо состояние, которое они могли ранее создать на сервере. – ChrisW

+0

@ChrisW - «Он не поддерживает какое-либо состояние, которое они могли ранее создать на сервере» - конечно, нет, такое состояние должно сохраняться, например. к базе данных, например.используя профиль. – Joe

+0

Техника, которую вы связали с работами, спасибо :) –

1

Просто догадаться: возможно, редактирование session.configuration внутри web.config может изменить срок действия файла cookie? Вы можете посмотреть here?

+1

Это не работает. Таймаут, указанный в конфигурации sessionstate, применим только к сеансу. Не Cookie хранится в браузере. – hreinn1000

1

Я думаю, что попытка сохранить сеанс в течение длительного времени является неправильным подходом и ограничивает вашу масштабируемость. Куки-файл сеанса указывает на определенный сеанс, который поддерживается IIS на сервере. В общем, вы хотите сеанс закрывается после закрытия пользователем своего браузера, чтобы не использовать все доступные серверные ресурсы для неактивных пользователей. Вы хотите, чтобы сеанс для уходящего пользователя закрывался, а ресурсы были доступны новому прибывающему пользователю. Вот почему срок действия cookie сеанса истекает.

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

+1

Я столкнулся с этим проблема с корзиной покупок, но я планировал использовать идентификатор сеанса для незарегистрированных пользователей, поэтому ваше последнее предложение не будет соответствовать счету. Любые другие идеи? –

+0

@DrazenBjelovuk: Я столкнулся с той же проблемой, у меня есть корзина для покупок в базе данных и вы хотите сохранить ссылку на нее в сеансе для незарегистрированных пользователей. Могу ли я спросить, как вы решили проблему? Какие-либо предложения? Спасибо. –

+0

@ TomPažourek Привет, Том. Я закончил использование отдельного файла cookie, представляющего случайно сгенерированный идентификатор недавно созданной записи временного корзины в базе данных, с полем истечения, установленным на то же значение, что и срок действия файла cookie. При регистрации продукты этой тележки (представленные в таблице CartProduct) просто имеют свое ранее пустое поле UserID, установленное на идентификатор вновь созданной учетной записи пользователя, и временную запись в корзину. [Фрагмент ERD] (http://i.imgur.com/l6cdCVe.png). –

3

на основе ссылок в ответ Джо, я понял, этот подход:

public void Application_PostRequestHandlerExecute(object sender, EventArgs e) 
{ 
    UpdateSessionCookieExpiration(); 
} 

/// <summary> 
/// Updates session cookie's expiry date to be the expiry date of the session. 
/// </summary> 
/// <remarks> 
/// By default, the ASP.NET session cookie doesn't have an expiry date, 
/// which means that the cookie gets cleared after the browser is closed (unless the 
/// browser is set up to something like "Remember where you left off" setting). 
/// By setting the expiry date, we can keep the session cookie even after 
/// the browser is closed. 
/// </remarks> 
private void UpdateSessionCookieExpiration() 
{ 
    var httpContext = HttpContext.Current; 
    var sessionState = httpContext?.Session; 

    if (sessionState == null) return; 

    var sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection; 
    var sessionCookie = httpContext.Response.Cookies[sessionStateSection?.CookieName ?? "ASP.NET_SessionId"]; 

    if (sessionCookie == null) return; 

    sessionCookie.Expires = DateTime.Now.AddMinutes(sessionState.Timeout); 
    sessionCookie.HttpOnly = true; 
    sessionCookie.Value = sessionState.SessionID; 
} 

Этот код может быть вставлен в Global.asax.cs.

+0

это, похоже, работает на меня :) –

1

Ответ Тома почти сработал для меня, за исключением того, что литье печенья в переменную и настройку ее свойств. Я должен был установить свойства объекта непосредственно следующим образом:

HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Expires = expiryDate; 
HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].HttpOnly = true; 
HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Value = sessionState.SessionID; 

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

Смежные вопросы