Изменение срока действия файла cookie состояния сеанса ASP.NET - PullRequest
6 голосов
/ 09 июня 2010

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

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

http://ahb.me/43e

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 13 сентября 2016

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

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.

2 голосов
/ 09 июня 2010

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

Или, если вы действительно хотите использовать Session State, попробуйте эту технику .

1 голос
/ 30 января 2018

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

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;

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

1 голос
/ 10 июня 2010

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

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

1 голос
/ 09 июня 2010

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

...