Причина, по которой существует два файла cookie, заключается в том, что ASP.NET Core использует шаблон Double Submit Cookie , описанный в листе подделки межсайтовых запросов OWASP (CSRF) .
В этой превосходной статье Защита ASP.NET Core CSRF с помощью Antiforgery описывает процесс гораздо более подробно, чем в документации Microsoft :
... он обеспечивает механизм защиты без сохранения состояния, состоящий из 2 элементов (или набора токенов), которые должны быть найдены при любом запросе, проверяемом пакетом Antiforgery:
токен защиты от подделкивключается в файл cookie, генерируется как псевдослучайное значение и шифруется с использованием нового API защиты данных
Дополнительный токен, включаемый в качестве поля формы, заголовка или файла cookie. Это включает в себя то же псевдослучайное значение, а также дополнительные данные из личности текущего пользователя. Он также зашифрован с использованием API защиты данных.
Эти токены будут сгенерированы на стороне сервера и распространены вместе с html-документом в браузере пользователя. Маркер cookie будет включен по умолчанию всякий раз, когда браузер отправляет новый запрос, в то время как приложение должно убедиться, что маркер запроса также включен. (В следующих разделах мы увидим, как это сделать)
Запрос будет отклонен, если:
- какой-либо из 2 токенов отсутствует или имеет неправильный формат / шифрование
- их псевдослучайные значения различны
- пользовательские данные, встроенные во второй токен, не соответствуют аутентифицированному в настоящее время пользователю
В случае Angular вы будете использовать их сервис $ http для отправки запросов AJAX. Этот сервис автоматически включает заголовок с именем X-XSRF-TOKEN, если он может найти значение токена в виде файла cookie с именем XSRF-TOKEN. Таким образом, самый простой способ - это играть так, как того требует Angular, и создать промежуточное программное обеспечение, которое получит токен запроса, и сохранить его значение в виде файла cookie XSRF-TOKEN.
Даже если он добавлен в виде файла cookie, это все еще токен запроса, а не токен cookie! Это может показаться странным, поэтому позвольте мне уточнить это:
Приложение отправит обратно в браузер файл cookie XSRF-TOKEN с токеном запроса и другой файл cookie .AspNetCore.Antiforgery. * С маркером cookie. Всякий раз, когда Angular отправляет Ajax-запрос, он будет включать заголовок X-XSRF-TOKEN с токеном запроса и cookie .AspNetCore.Antiforgery. * С токеном cookie. Проверка Antiforgery проверит, что оба токена являются действительными и имеют один и тот же секрет и т. Д.
Таким образом, должно быть два куки. В моем сценарии файл cookie .AspNetCore.Antiforgery.*
, отправляемый с каждым запросом, составляет половину набора токенов, а затем Angular использует XSRF-TOKEN
для установки заголовка X-XSRF-TOKEN
, который составляет другую половину набора токенов. .
См. Также: