установить cookie, чтобы истечь в конце сеанса?asp.net - PullRequest
34 голосов
/ 17 сентября 2010

Я удивлен, что не смог найти никаких ответов.

Как мне установить мой sessionid в моем cookie, чтобы истечь в конце сессии?(когда браузер закрывается или пользователь неактивен в течение определенного периода времени).

Два решения, которые я нашел, были

(httpcookie).Expires = HttpContext.Current.Session.Timeout

, которые дали мне ошибку компиляции, поэтому я незнать, если пользователь проверил свой код перед публикацией.А другой должен был установить дату истечения 1 день назад, что моя интуиция говорит, что это неправильно.Как мне это сделать?

Ответы [ 4 ]

51 голосов
/ 17 сентября 2010

Вы говорите о непостоянном cookie. По умолчанию asp.net отправляет куки таким способом. Основное различие между ними заключается в том, что для постоянного файла cookie задано значение expires.

Так что, если вы не хотите, чтобы cookie сохранялись, не устанавливайте значение expires.

Тем не менее, cookie будет оставаться в памяти, пока браузер фактически не закроется. Допустим, они заходят на ваш сайт, а вы устанавливаете непостоянный файл cookie. Они делают вещи и уходят. Позже они, используя тот же экземпляр браузера, возвращаются на ваш сайт. Печенье все еще будет там.

Теперь, если они закроют браузер в любой момент, то файл cookie будет удален.

Дело в том, не устанавливайте заголовок expires. Особенно, когда истекает дата сессии. Даты сессий, как правило, будут составлять всего около 20 минут в будущем, но срок их действия продлевается, когда пользователь просматривает ваш сайт.

===== update =====

Я использовал следующий код для тестирования:

    protected void Page_Load(object sender, EventArgs e) {
        if (!Page.IsPostBack) {
            HttpCookie c = Request.Cookies["test"];
            if (c != null) {
                Response.Write(String.Format("test value is {0} <br />", c.Value));
            }
        } else {
            HttpCookie c = new HttpCookie("test");
            c.Value = "HERE IT IS";
            Response.Cookies.Add(c);
        }
    }

    protected void Button1_Click(object sender, EventArgs e) {
        Response.Write("clicked<br />");
    }

файл .aspx просто имел кнопку, которая запускала этот обработчик button1_click. Когда я сначала захожу к нему с помощью любого из последних браузеров (например, Firefox, Chrome), там нет cookie. После того, как я нажму кнопку, файл cookie будет установлен. Затем я полностью закрыл браузер, снова открыл и вернулся на сайт. Во всех случаях печенье пропало.

8 голосов
/ 17 июня 2014

Важно отметить, что в наши дни вы не можете рассчитывать на удаление файла cookie сеанса, когда пользователь закрывает браузер.И Chrome, и Firefox сделали это изменение еще в 2012 году или около того - см. Различные ссылки на этот ответ .

Теперь, если я не удаляю сеансовые куки, это кажется мне ужасным, ужасным, ничего хорошегоОчень плохая дыра в безопасности, не говоря уже о нарушении всех соответствующих RFC, но, видимо, наши Повелители Google (и Mozilla) знают лучше.

Я не уверен, что лучший обходной путь, но подход, который я 'Мне нужно сбросить свойство «Expires» в куки на час в будущем после каждого вызова.Это не совсем желаемое поведение, но я думаю, что это лучше, чем позволять важным cookie-файлам оставаться навсегда.

Открыты для других предложений или разъяснений.

2 голосов
/ 17 сентября 2010

TimeOut возвращает int, Expires ожидает DateTime, поэтому этот код не будет компилироваться. Установка даты истечения срока действия в прошлом сразу же аннулирует куки, так что это, вероятно, не то, что вы хотите. Если вы оставите дату окончания срока действия неиспользованной, срок действия файла cookie истечет, как только пользователь закроет браузер.

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

Не стесняйтесь уточнять проблему.

1 голос
/ 27 ноября 2014

НЕ используйте контроль входа в систему, это усложняет.

protected void btnLogin_Click(object sender, EventArgs e) 
{
    // Check user and password in database
    bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text);

    // Set cookie to be not persistent - this means if the user closes the browser, 
    //autentification cookie will be deleted and the user is not longer logged 
    bool isPersistentCookie = false;

    // Login user with the new username
    FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...