asp.net-core - 如何在无视图 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保护如何配置?
解决方案
我建议不要使用默认的 ValidateAntiForgeryToken 属性
所有更艰巨的工作都由 services.AddAntiforgery() 完成,而 ValidateAntiForgeryToken 只需调用 antiforgery.ValidateRequestAsync()
您可以为它创建自己的过滤器并注册它等等。但是看看这个简洁的实现,您可以简单地在所有 POST api 方法中注入一个 IAntiforgery 实例
推荐阅读
- javascript - Gulp 执行问题和错误。吞咽 4
- javascript - 删除的项目不影响总数
- python - IndexError:列出超出范围的索引动态主题模型
- azure - 如何比较 2 个 Cosmos 数据库容器以查看它们是否在文档中包含相同的数据负载?
- c# - 如何从我的 api json 响应中获取片段信息?
- r - 如何为闪亮的应用程序输入开发者信息
- c++ - 信号:中止(核心转储),从向量生成两个和对
- latex - Latex 中的 Minipage 无法编译
- html - 我的对齐项目中心不起作用。为什么?
- google-ads-api - 当我尝试在 Google Ads 中制作自适应搜索广告时,预览部分没有显示我的广告的外观,而是显示