В чем ASP.NET Core AntiforgeryTokenSet, в чем разница между использованием RequestToken и CookieToken? - PullRequest
1 голос
/ 04 октября 2019

У нас есть веб-приложение ASP.NET Core 2.2 с Angular SPA, использующим аутентификацию cookie.

Я следую документации, чтобы настроить функции защиты от подделки с помощью IAntiforgery .

Соответствующие фрагменты кода:

services.AddAntiforgery();
public void Configure(IApplicationBuilder app, IAntiforgery antiforgery)
{
    app.Use(next => context =>
    {
        string path = context.Request.Path.Value;

        if (
            string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) ||
            string.Equals(path, "/index.html", StringComparison.OrdinalIgnoreCase))
        {
            // The request token can be sent as a JavaScript-readable cookie, 
            // and Angular uses it by default.
            var tokens = antiforgery.GetAndStoreTokens(context);
            context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, 
                new CookieOptions() { HttpOnly = false });
        }

        return next(context);
    });
}

Вызов antiforgery.GetAndStoreTokens(context) возвращает AntiforgeryTokenSet со свойствами RequestToken и CookieToken.

Если IИспользуя приведенный выше код с конфигурацией по умолчанию, я получаю два файла cookie: .AspNetCore.Antiforgery.* (соответствует CookieToken) и XSRF-TOKEN (соответствует RequestToken) с разными значениями.

В чем разницапри использовании между RequestToken и CookieToken

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Причина, по которой существует два файла 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, который составляет другую половину набора токенов. .


См. Также:

1 голос
/ 04 октября 2019

XSRF-TOKEN:

Это файл cookie, который можно прочитать на JavaScript и который приложение Angular будет читать и отправлять в виде заголовка HTTP.

.AspNetCore.Antiforgery.*:

Это файл cookie только для HTTP (т. Е. , а не для чтения JavaScript), который браузер отправляет обратно на сервер в виде обычного файла cookie.


Защита CSRF в ASP.NET Core ожидает отправки заголовка HTTP и файла cookie. При проверке запроса он проверяет как заголовок, так и cookie. Если какой-либо из них отсутствует, проверка завершится неудачей.

...