Httpcookie не удаляется при изменении сеанса или недействительна

StackOverflow https://stackoverflow.com/questions/3292886

Вопрос

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

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

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

Если это все правда, мне может быть сохранить исходный идентификатор сеанса («asp.net_sessive») в 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];
}
.

Это было полезно?

Решение

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

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

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

Если это все правда, мне возможно Храните оригинальный идентификатор сеанса («ASP.Net_sessiDID») в cookie, Затем проверьте его на текущий Идентификатор сеанса, если они разные, то Удалите файл cookie или создайте новый.

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top