首页 > 解决方案 > 如何在无视图 Web API 中配置防伪保护

问题描述

我正在使用 ASP.NET Core 实现 REST API。它是无状态的,除了使用 cookie 进行身份验证,因此容易受到跨站点请求伪造 (CSRF) 攻击。

幸运的是,ASP.NET Core 提供了一种保护措施:防止 ASP.NET Core 中的跨站点请求伪造 (XSRF/CSRF) 攻击

由于我的应用程序没有任何视图或页面,我只services.AddControllers()在我的Startup.

访问属性为 的 REST 端点时,[ValidateAntiForgeryToken]出现以下异常:

System.InvalidOperationException:没有为“Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.ValidateAntiforgeryTokenAuthorizationFilter”类型注册服务。

使用注册我的控制器services.AddControllersWithViews()会使这个错误消失,因为它在内部注册了适当的服务。

根据文档

当在 Startup.ConfigureServices 中调用以下 API 之一时,Antiforgery 中间件将添加到依赖注入容器中:

添加Mvc

MapRazorPages

地图控制器路由

MapBlazorHub

在我看来,所有这些方法都是以视图为中心的(除了MapControllerRoute我在Configure我的方法中所做的,Startup但它没有帮助)并且缺少服务的命名空间的一部分是ViewFeatures. 这让我感到困惑,因为在我的理解中,尽管我正在开发一个没有视图的纯 Web API,但需要照顾 CSRF。

我的理解错了吗?不涉及视图时,CSRF保护如何配置?

标签: asp.net-coreasp.net-core-webapicsrf

解决方案


我建议不要使用默认的 ValidateAntiForgeryToken 属性

所有更艰巨的工作都由 services.AddAntiforgery() 完成,而 ValidateAntiForgeryToken 只需调用 antiforgery.ValidateRequestAsync()

您可以为它创建自己的过滤器并注册它等等。但是看看这个简洁的实现,您可以简单地在所有 POST api 方法中注入一个 IAntiforgery 实例

https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/security/anti-request-forgery/sample/AngularSample/Startup.cs


推荐阅读