我想在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 –