ValidateAntiForgeryToken в приложении ASP.NET Core React SPA - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь использовать инструменты инфраструктуры, чтобы добавить простую проверку CSRF в ASP.NET Core React SPA.Само приложение, по сути, является установкой create-реагировать на приложение (один index.html с корневым элементом и всем остальным загружается из связанного JavaScript).

Работа с некоторой информацией, найденной по ссылкам, таким как этот , я установил следующее в моем Startup.ConfigureServices:

services.AddAntiforgery(options => options.Cookie.Name = "X-CSRF-TOKEN");

и подтвердил в моих инструментах Chrome, что cookie устанавливается.Если я опущу приведенную выше строку, cookie все равно будет установлен с частично рандомизированным именем, например: .AspNetCore.Antiforgery.RAtR0X9F8_w В любом случае, cookie устанавливается.Я также подтвердил, что при каждом перезапуске всего приложения значение cookie обновляется, поэтому инфраструктура активно устанавливает этот cookie.

Наблюдая за сетевыми запросами в моих инструментах Chrome, я подтверждаю, что cookie являетсяотправляется на сервер по запросу AJAX.Размещение точки останова на сервере и наблюдение значения Request.Cookies в действии контроллера также подтверждают это.

Однако, если я украшу любое такое запрашиваемое действие AJAX с помощью [ValidateAntiForgeryToken], то ответ всегда будет пустым 400.

Есть ли шаг конфигурации, который я где-то пропустил?Возможно, атрибут действия находится не в том месте, и мне нужно использовать другую проверку?

1 Ответ

0 голосов
/ 27 ноября 2018

Я просто проверяю журнал и выясняю, что есть исключение:

Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: Требуемый файл cookie для защиты от подделки ".AspNetCore.Antiforgery.HPE6W9qucDc" отсутствует.в Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateRequestAsync (HttpContext httpContext) в Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.Ontoxt 100забыл настроить имя файла cookie :

   public void ConfigureServices(IServiceCollection services)
   {
       //services.AddAntiforgery();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

       // In production, the React files will be served from this directory
       services.AddSpaStaticFiles(configuration =>
       {
           configuration.RootPath = "ClientApp/build";
       });
   }

Поэтому я просто добавляю конфигурацию, как показано ниже:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAntiforgery(o => {
            o.Cookie.Name = "X-CSRF-TOKEN";
        });
        // ...
    }

, и теперь она работает.

Кроме того, если вы хотите опустить строку services.AddAntiforgery(options => options.Cookie.Name = "X-CSRF-TOKEN");, вы можете использовать встроенный метод antiforgery.GetAndStoreTokens(context) для отправки cookie:

   app.Use(next => context =>
    {
        if (context.Request.Path == "/")
        {
            //var tokens = antiforgery.GetTokens(context);
            var tokens = antiforgery.GetAndStoreTokens(context);
            context.Response.Cookies.Append("X-CSRF-TOKEN", tokens.CookieToken, new CookieOptions { HttpOnly = false });
            context.Response.Cookies.Append("X-CSRF-FORM-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false });
        }
        return next(context);
    })

Оба должны работать как положено.

...