Странное поведение с cookie-файлами сеанса ASP.NET, токенами CSRF и Ajax Calls - PullRequest
0 голосов
/ 19 декабря 2018

при проверке токенов CSRF мы наблюдаем странную ситуацию.Вот последовательность событий с токенами, замененными буквами:

  1. Пользователь выходит из системы.Перенаправляется на домашнюю страницу.

    Session.Abandon(); FormsAuthentication.SignOut();

  2. Создается новый сеанс с новым идентификатором сеанса (S1) и новым токеном CSRF (T1).

    protected void Session_Start(object sender, EventArgs e) { Response.Cookies["ASP.NET_SessionId"].Secure = true; Token = NewToken(); }

  3. Домашняя страница загружает и запускает запрос JS Ajax, который содержит токен (T1) для проверки.Из проверки мы знаем, что по какой-то причине этот запрос содержит пустой файл cookie ASP.NET_SessionId (ASP.NET_SessionId=;), когда он должен иметь идентификатор сеанса (S1).Следовательно, он обрабатывается как новый сеанс на бэкэнде, и шаг 2 повторяется для этого запроса.У бэкэнда теперь есть новый идентификатор сеанса (S2) и новый токен (T2).

  4. Бэкэнд продолжает обслуживать Ajax-запрос.Он сравнивает токен (T1) с токеном (T2) и не работает.
  5. Последующие вызовы на сайте после обновления страницы или перехода на другую страницу завершаются без проблем.Ajax-запросы содержат файл cookie ASP.NET_SessionId, и все работает, как и ожидалось.Они выполняются под идентификатором сеанса (S1) и токеном (T1).

Нам удалось частично отследить проблему, установив для ASP.NET_SessionId cookie значение HTTP Only:

Response.Cookies["ASP.NET_SessionId"].Secure = true;

Если мы удалим это, оно будет работать на обоих,первый запрос после выхода из системы, а также последующие запросы.Файл cookie ASP.NET_SessionId отправляется на все вызовы Ajax.

Мы [очевидно] хотим обеспечить безопасность файлов cookie, поэтому удаление Secure = true не вариант.

Почему Ajax запрашиваетзагрузка первой страницы после выхода из системы не передать значение для ASP.NET_SessionId cookie, но последующие запросы делают?Это похоже на то, что файл cookie ASP.NET_SessionId не готов или не доступен в JS для первоначального запроса после загрузки, но может быть прочитан в последующих запросах (навигация / перезагрузка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...