我想在MVC 3的Global.asax文件中实现Anti-CSRF令牌。 是否可以在Gloabl.asax文件中实现相同的功能。
答案 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);
}
参考文献: