Сохранение файлов cookie: невозможно установить дату истечения срока действия

#asp.net #asp.net-mvc #cookies

#asp.net #asp.net-mvc #файлы cookie

Вопрос:

Я пытаюсь изменить веб-сайт MVC, который хранил некоторую информацию в сеансе, чтобы сохранить ее в файле cookie, но у меня возникли некоторые проблемы с истечением срока действия файла cookie.

Сценарий При входе на сайт создается файл cookie и добавляется в текущую коллекцию файлов cookie ответа HttpContext. Фрагмент кода, используемый для записи cookie, выглядит следующим образом :

 HttpCookie userCredsCookie = _context.Response.Cookies.Get(Constants.Web.UserCredentialsCookieName) ?? new HttpCookie(Constants.Web.UserCredentialsCookieName);
                userCredsCookie.HttpOnly = true;
                userCredsCookie.Secure = true;
                userCredsCookie.Value = user.ID.ToString();
                userCredsCookie.Expires = DateTime.Now.AddMinutes(user.CompanySessionTimeout   user.TimezoneOffset);                
                _context.Response.Cookies.Add(userCredsCookie);
  

Я экспериментировал с удалением строки, которая устанавливает срок действия файла cookie, и обнаружил, что файл cookie генерируется и сохраняется на клиенте, как и ожидалось.

Когда я проверяю ответ от сервера с помощью Fiddler, я вижу, что возвращается файл cookie userCreds :

 Response sent 111 bytes of Cookie data:
    Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; expires=Mon, 09-Oct-2017 16:20:43 GMT; path=/; secure; HttpOnly
  

когда срок действия не установлен, ответ имеет :

 Response sent 72 bytes of Cookie data:
 Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; path=/; secure; HttpOnly
  

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

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

Буду признателен за любую помощь.

С уважением, Монти

Обновление — обнаружена возможная причина

Я обнаружил, что проблема, с которой я сталкиваюсь, связана со временем. Кажется, что мой компьютер разработчика может обрабатывать ответы от вызова ajax, который слишком быстро устанавливает cookie (??? это вообще возможно ???).

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

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

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

Звучит ли это вообще возможно?

Комментарии:

1. какова ценность user. CompanySessionTimeout и пользователь. timezoneOffset?

2. в случае, если я работал с пользователем. CompanySessionTimeout устанавливается равным 1 году (в минутах, конечно) и пользователю. timezoneOffset установлен на 660 минут, однако он был протестирован пользователем. CompanySessionTimeout установлен на 10 минут ранее

Ответ №1:

попробуйте использовать этот код

 int result = Convert.ToInt32(user.CompanySessionTimeout.ToString())   Convert.ToInt32(user.TimezoneOffset)
  

а затем передать

 userCredsCookie.Expires = DateTime.Now.AddMinutes(result);
  

Комментарии:

1. Я попробую это, но не вижу, как это повлияет на что-то другое… Я знаю, что срок действия установлен в файле cookie, но когда он установлен, файл cookie не сохраняется.

2. Спасибо за совет LateshtClick.com но, как я и ожидал, никаких изменений в поведении при этом изменении кода не произошло… Я также изменил код для использования файлов cookie. Установить, а не файлы cookie. Добавьте (как я видел в ответах на другие вопросы), и это также не повлияло на поведение.