2016-01-04 37 views
1

,我傾向於在我的baseController頂部添加屬性ValidateAntiForgeryToken,以便所有操作都將受該屬性的影響。由於安全原因,僅針對特定操作忽略ValidateAntiForgeryToken

我想僅對單個動作禁用該屬性。

不爲我的baseController派生不是一個選項。 不幸的是,ValidateAntiForgeryToken屬性是密封類,所以我不能創建自己的customValidateAntiForgeryToken屬性基於原始的ValidateAntiForgeryToken屬性。

回答

2

這是真的,該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) 
{ 
    ... 
} 
相關問題