ASP.NET Core React SPA应用程序中的ValidateAntiForgeryToken

时间:2018-11-26 19:12:29

标签: asp.net-core csrf

我正在尝试使用框架的工具向ASP.NET Core React SPA添加一些简单的CSRF验证。该应用程序本质上是一个create-react-app设置(带有根元素的单个index.html,其他所有内容都从捆绑的JavaScript中加载)。

修补了在诸如this one之类的链接上找到的一些信息后,我在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值也可以确认这一点。

但是,如果我用[ValidateAntiForgeryToken]装饰任何此类AJAX请求的操作,则响应始终为空400。

我在某处错过了配置步骤吗?也许action属性的位置错误,我需要使用其他验证吗?

1 个答案:

答案 0 :(得分:3)

我只是检查日志,发现有一个例外:

  

Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:所需的防伪cookie“ .AspNetCore.Antiforgery.HPE6W9qucDc”不存在。      在Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateRequestAsync(HttpContext httpContext)      在Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.OnAuthorizationAsync(AuthorizationFilterContext context)中

它表示您forgot to configure the cookie name

RecyclerView

所以我只添加如下配置:

   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");方法来发送cookie:

antiforgery.GetAndStoreTokens(context)

两者都应按预期工作。