HttpCookie не удаляется при изменении сеанса или является недействительным - PullRequest
3 голосов
/ 20 июля 2010

Я создаю HttpCookie, задаю только имя и значение, а не свойство expires, а затем добавляю его в ответ. Достаточно просто. Файл cookie создается (но не сохраняется), как ожидалось. Проблема в том, что когда сеанс меняется по какой-то причине (например, веб-сайт был перестроен или я перестроил свое приложение при отладке), тогда cookie-файлы остаются. Я хочу, чтобы файл cookie действовал только для исходного сеанса, в котором он был создан.

Согласно MSDN, в нем говорится: «Если вы не укажете ограничение срока действия файла cookie, файл cookie не будет сохранен на клиентском компьютере и срок его действия истечет после истечения сеанса пользователя».

Полагаю, я не знаю точно, что означает "сессия истекает". Я полагаю, что cookie удаляется через 20 минут после окончания сеанса. Но следует ли удалить cookie, если сеанс, в котором он был создан, больше не существует по ряду причин? Единственный раз, когда я видел удаление куки, это когда пользователь закрывает все окна браузера и открывает новое.

Если это все так, мне, возможно, придется сохранить исходный идентификатор сеанса («ASP.NET_SessionId») в файле cookie, затем проверить его по текущему идентификатору сеанса, если они отличаются, затем удалить файл cookie или создать новый.

Вот код (единственное различие между моим файлом cookie и тем, что в примерах MSDN, я храню несколько значений в файле cookie):

private void SaveValuesToCookie(string[] names, string[] values)
{
    HttpCookie cookie = new HttpCookie("MyCookie");

    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        cookie.Values[name] = values[i];
    }
    Response.Cookies.Add(cookie);
}

private string GetValueFromCookie(string name)
{
    HttpCookie cookie = Request.Cookies["MyCookie"];
    if (cookie == null)
        return null;

    return cookie.Values[name];
}

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Единственный раз, когда я видел, как получилось печенье удаляется, когда пользователь закрывает все окна браузера и открывает новый.

И это именно то, что означает MSDN, когда говорится, что cookie будет удален по окончании сеанса. К сожалению, я считаю, что в любом случае это не одинаково для всех браузеров, поэтому он никому не нужен.

Вы всегда должны устанавливать дату истечения срока действия файлов cookie.

Если это все правда, возможно, мне придется сохранить исходный идентификатор сеанса ("ASP.NET_SessionId") в файле cookie, тогда проверьте это против текущего идентификатор сессии, если они разные, то удалите cookie или создайте новый.

Ненавижу это говорить, но это вам тоже не поможет. .NET Framework любит перерабатывать идентификаторы сеансов, поэтому вы не можете гарантировать, что они будут другими.

Плохие новости, я бы посоветовал вам пересмотреть то, что вы пытаетесь сделать с архитектурной точки зрения.

Перезапуск приложения происходит полностью на сервере; куки - это то, что происходит полностью на клиенте. Пока клиент общается с сервером, это чисто отношение запрос / ответ, сервер не может передавать в браузер такие события, как перезапуск приложения.

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

0 голосов
/ 21 июля 2010

Я знаю обо всем этом, но он недостаточно безопасен для нужд наших клиентов.Сеанс все еще может быть подделан или введен.См .: http://msdn.microsoft.com/en-us/magazine/cc163730.aspx#S9

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

...