如何在无视图 Web API 中配置防伪保护

Dej*_*jan 16 csrf asp.net-core asp.net-core-webapi

我正在使用 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 之一时,防伪中间件被添加到依赖注入容器中:

添加MVC

MapRazorPages

地图控制器路由

MapBlazorHub

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

我的理解有误吗?不涉及视图时如何配置CSRF保护?

Lar*_*ryX 3

我建议放弃默认的 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

  • 链接是死胡同 (4认同)