问题描述
我已经了解到CSRF令牌在Razor页面中会自动进行验证,但这是否也适用于控制器,还是我仍然必须在视图中使用@Html.AntiForgeryToken()
TagHelper和我的[ValidateAntiForgeryToken]
属性控制器方法?
如果是这样,我已经读过Andrew Locks Blog,可以添加一个Filter来执行相同的操作,但这是在NetCore 3. +之前的。
我的Startup.cs
中的此实现正确吗?
services.AddControllers()
.AddMvcoptions(options => {
options.Filters.Add(new AutovalidateAntiforgeryTokenAttribute());
});
解决方法
否,您不需要使用@Html.AntiForgeryToken()
,因为当您使用<form>
标签帮助程序时,它将为您插入防伪令牌(如果method
属性为“ post ”,而action
不是外部超链接。
在ASP.NET Core 2.0或更高版本中,FormTagHelper将防伪令牌注入HTML表单元素。
并且:
当标记包含method =“ post”属性且以下任一条件为true时,会自动生成HTML表单元素的防伪标记:
- 动作属性为空(action =“”)。
- 未提供action属性()。
也:
我们建议在非API方案中广泛使用
AutoValidateAntiforgeryToken
。这样可以确保POST操作在默认情况下受到保护。替代方法是默认情况下忽略防伪令牌,除非将ValidateAntiForgeryToken
应用于各个操作方法。