仅针对特定操作忽略ValidateAntiForgeryToken

时间:2016-01-04 09:54:55

标签: asp.net-mvc

出于安全原因,我更喜欢在我的baseController上添加属性ValidateAntiForgeryToken,以便所有操作都会受到该属性的影响。

我想仅针对单个操作禁用该属性。

不能为我的baseController派生不是一个选项。 遗憾的是,ValidateAntiForgeryToken属性是密封类,因此我无法根据原始的ValidateAntiForgeryToken属性创建自己的customValidateAntiForgeryToken属性。

2 个答案:

答案 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()