Подтвердить что ты не робот

Установить cookie для истечения срока действия в конце сеанса? asp.net

Я удивлен, что не нашел ответов.

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

Два найденных нами решения были

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

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

4b9b3361

Ответ 1

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

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

Тем не менее, cookie останется в памяти до тех пор, пока браузер не будет закрыт. Скажем, они просматривают ваш сайт, и вы устанавливаете непостоянный файл 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 simple была кнопка, которая запускала этот обработчик button1_click. Когда я изначально просматриваю его с помощью любого из последних браузеров (например, firefox, chrome), cookie не существует. После того, как я нажму кнопку, будет установлен cookie. Затем я полностью закрыл браузер, снова открыл его и перешел на сайт. Во всех случаях файл cookie пропал.

Ответ 2

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

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

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

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

Ответ 3

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

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

Не стесняйтесь подробно остановиться на проблеме.

Ответ 4

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

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);
}