MVC 3中的反CSRF实现

时间:2017-08-28 08:05:58

标签: c# asp.net-mvc asp.net-mvc-3 csrf global-asax

我想在MVC 3的Global.asax文件中实现Anti-CSRF令牌。 是否可以在Gloabl.asax文件中实现相同的功能。

2 个答案:

答案 0 :(得分:1)

我不这么认为。对于每个请求,我们需要检查令牌。 请尝试在视图文件中使用以下代码。

@ Html.AntiForgeryToken()

答案 1 :(得分:1)

通过检查IAuthorizationFilter请求,似乎您需要创建一个为所有POST方法实现HttpContext.Request.HttpMethod的自定义过滤器类:

public class ValidateAntiForgeryTokenEveryPost : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext context)
    {
        if (context.HttpContext.Request.HttpMethod == "POST")
        {
            System.Web.Helpers.AntiForgery.Validate();
        }
    }
}

然后,在FilterConfig class:

中添加新过滤器
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ValidateAntiForgeryTokenEveryPost());
    }
}

同时确保自定义过滤器已在Global.asax代码中注册:

protected void Application_Start()
{
    // other settings

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    // other settings
}

通过使用上面给出的全局过滤,无论视图页面中是否存在AntiForgeryToken,所有POST方法请求都会自动检查@Html.AntiForgeryToken()

附录1:

可以从CSRF令牌检查中排除某些操作,您需要在自定义属性类存在时阻止Validate方法执行。首先,为验证检查创建自定义属性类:

[AttributeUsage(AttributeTargets.Method)]
public class ExcludeAntiForgeryCheckAttribute : Attribute
{
    // other stuff
}

之后,使用ActionDescriptor.GetCustomAttributes获取上面创建的自定义属性类型:

public class ValidateAntiForgeryTokenEveryPost : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext context)
    {
        // adapted from Darin Dimitrov (/a/34588606/)
        bool isValidate = !context.ActionDescriptor.GetCustomAttributes(typeof(ExcludeAntiForgeryCheckAttribute), true).Any();

        // use AND operator (&&) if you want to exclude POST requests marked with custom attribute
        // otherwise, use OR operator (||)
        if (context.HttpContext.Request.HttpMethod == "POST" && isValidate)
        {
            System.Web.Helpers.AntiForgery.Validate();
        }
    }
}

然后,您可以修饰任何应该免除CSRF验证令牌的方法:

[HttpPost]
[ExcludeAntiForgeryCheck]
public ActionResult Index(ViewModel model)
{
    // other stuff

    return View(model);
}

参考文献:

Check CRSF token by default in ASP.NET MVC(标准版)

Securing all forms using AntiForgeryToken(基于属性的版本)