при проверке токенов CSRF мы наблюдаем странную ситуацию.Вот последовательность событий с токенами, замененными буквами:
Пользователь выходит из системы.Перенаправляется на домашнюю страницу.
Session.Abandon();
FormsAuthentication.SignOut();
Создается новый сеанс с новым идентификатором сеанса (S1) и новым токеном CSRF (T1).
protected void Session_Start(object sender, EventArgs e)
{
Response.Cookies["ASP.NET_SessionId"].Secure = true;
Token = NewToken();
}
Домашняя страница загружает и запускает запрос JS Ajax, который содержит токен (T1) для проверки.Из проверки мы знаем, что по какой-то причине этот запрос содержит пустой файл cookie ASP.NET_SessionId (ASP.NET_SessionId=;
), когда он должен иметь идентификатор сеанса (S1).Следовательно, он обрабатывается как новый сеанс на бэкэнде, и шаг 2 повторяется для этого запроса.У бэкэнда теперь есть новый идентификатор сеанса (S2) и новый токен (T2).
- Бэкэнд продолжает обслуживать Ajax-запрос.Он сравнивает токен (T1) с токеном (T2) и не работает.
- Последующие вызовы на сайте после обновления страницы или перехода на другую страницу завершаются без проблем.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 для первоначального запроса после загрузки, но может быть прочитан в последующих запросах (навигация / перезагрузка).