我想在MVC 3的Global.asax文件中实现Anti-CSRF令牌。 是否可以在Gloabl.asax文件中实现同样的功能。MVC 3中的反CSRF实施3
1
A
回答
1
看来你需要的是通过检查HttpContext.Request.HttpMethod
请求创建一个自定义过滤器类,它实现IAuthorizationFilter
所有POST
方法:
public class ValidateAntiForgeryTokenEveryPost : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext context)
{
if (context.HttpContext.Request.HttpMethod == "POST")
{
System.Web.Helpers.AntiForgery.Validate();
}
}
}
然后,添加新滤波器FilterConfig
类:
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
}
通过使用上面给出的全局过滤,所有POST方法请求都自动检查AntiForgeryToken
,不管@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);
}
参考文献:
1
我不这么认为。对于每个请求我们需要检查令牌。 请尝试在视图文件中使用以下代码。
@ Html.AntiForgeryToken()
+0
我们可以在每个视图页面实现。但我想在Global.asax文件中实现相同的功能。 –
相关问题
- 1. 发布旧令牌的反CSRF实施
- 2. 实施春季3和JSP
- 3. 实施队列轨道3
- 4. 实现在MVC 3
- 5. CSRF Codeigniter 3验证
- 6. MVC 3中的RegularExpression 3
- 7. MVC 3中的ASP.NET MVC 4模板3
- 8. Facebook验证实施例CSRF
- 9. MVC 3的SignalR实现
- 10. 的Rails 3 has_and_belongs_to_many和accepts_nested_attributes_for实施
- 11. jquery ui标签与淘汰赛使用mvc 3如何实施?
- 12. 春季4.3我如何做CSRF实施?
- 13. 结果代码3实施时AppInvites
- 14. 在3个网站之间实施SSO
- 15. Kohana 3 - 实施维护模式
- 16. 酒吧子实施零mq 3.xx
- 17. 在斯威夫特实施fetchedresultsviewcontroller 3
- 18. 最佳实践ASP.NET MVC 3
- 19. ASP.NET MVC 3实时事件。
- 20. 如何反转义的URL在MVC 3
- 21. CodeIgniter中的CSRF和Ajax问题3
- 22. 自从CSRF Fix/plone.protect 3
- 23. 编辑ASP.NET MVC 3中的动作3
- 24. MVC 3中的Windows身份验证3
- 25. 确定mvc 3中的上一页3
- 26. Rails 3反馈插件3
- 27. MVC 3
- 28. MVC 3 -
- 29. RSS反馈不正确 - 使用MVC 3
- 30. ASP.Net MVC 3:反向授权属性
非常感谢。还有一个问题。我是MVC的新手,所以我不确定我需要创建自定义过滤器类的文件夹。你能告诉我这个吗? –
我认为你的自定义过滤类可以在'App_Start'目录或你想要的任何目录下创建,只要使用了项目的根名称空间而不是'ProjectName.App_Start'或'ProjectName.FolderName'。 –
非常感谢。@Tetsuya Yamamoto –