Httpcookie не удаляется при изменении сеанса или недействительна
-
18-09-2020 - |
Вопрос
Я создаю 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 отдельно от сеанса и обновить дату истечения срока годности, когда я могу (то есть, когда пользователь доступа к определенным страницам).