出于安全原因,我更喜欢在我的baseController上添加属性ValidateAntiForgeryToken,以便所有操作都会受到该属性的影响。
我想仅针对单个操作禁用该属性。
不能为我的baseController派生不是一个选项。 遗憾的是,ValidateAntiForgeryToken属性是密封类,因此我无法根据原始的ValidateAntiForgeryToken属性创建自己的customValidateAntiForgeryToken属性。
答案 0 :(得分:3)
ValidateAntiForgeryToken
课程是密封的,但是我们自己并不是火箭科学:
public class MyValidateAntiForgeryTokenAttribute: FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
System.Web.Helpers.AntiForgery.Validate();
}
}
现在我们实现的所有内容当然是在filterContext中添加一些检查,以确定当前操作是否使用某个自定义ExcludeFromAntiForgeryValidation
属性进行修饰而不是调用Validate
方法。
有些事情:
public class MyValidateAntiForgeryTokenAttribute: FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
bool shouldValidate = !filterContext
.ActionDescriptor
.GetCustomAttributes(typeof(ExcludeFromAntiForgeryValidationAttribute), true)
.Any();
if (shouldValidate)
{
System.Web.Helpers.AntiForgery.Validate();
}
}
}
然后只写一个自定义属性:
[AttributeUsage(AttributeTargets.Method)]
public class ExcludeFromAntiForgeryValidationAttribute : Attribute
{
}
您将用于装饰您想要排除防伪验证的控制器操作:
[HttpPost]
[ExcludeFromAntiForgeryValidation]
public ActionResult Index(MyViewModel model)
{
...
}
答案 1 :(得分:2)
如果您需要显式忽略方法中的防伪令牌,则可以 可以通过应用 [IgnoreAntiforgeryToken] 来禁用对动作的验证 方法的属性。
[IgnoreAntiforgeryToken]
public IActionResult MyFunction()