2015-06-02 16 views
5

Açıkça tanımlamak zorunda kalmadan bir denetleyicideki tüm HTTP gönderme yöntemlerinde otomatik olarak [ValidateAntiForgeryToken] ek açıklamasına sahip olmanın bir yolu var mı?MVC Uygulamalarında Anti Sahtecilik Jetonu Onayı'nı Otomatikleştirme

ve aynı zamanda MVC Html.BeginForm() yardımcısını anti parazit belirtecini her zaman dahil edecek şekilde genişletmenin bir yolu var mı?

ve son olarak, bunu yapmanın amacı bazı şeyleri uygulamada tutarlı tutmaktır, bazı senaryolar için bunu yapmamanın bir nedeni olabilir mi?

+1

[Chameleon Formları] 'na (https://github.com/MRCollective/ChameleonForms) göz attınız mı? – Bringer128

+0

@ Bringer128 bunun için teşekkürler, ancak bu tek şey için bir çerçeve kullanmaya eğilimli değil. – Ahsan

+0

[Bir AntiForgeryToken alanı içerecek şekilde BeginForm'u nasıl genişletebilir veya geçersiz kılabiliriz?] 'Nin olası bir kopyası (http://stackoverflow.com/questions/6552830/how-to-extend-or-override-beginform-to-include-a-antiforgerytoken- alan) –

cevap

4

Bu konuyu kendim araştırıyordum ve aşağıdaki tam çözümü ve ayrıca here'u derledim. AntiForgeryTokenFilterProvider ve BeginSecureForm yardımcı metodu dahil olmak üzere birkaç parçadan oluşmaktadır. Ayrıca DisableAntiForgeryCheckAttribute ile tek bir eylem için geçerliliği atlamayı sağlar.

public class AntiForgeryTokenFilterProvider : IFilterProvider 
{ 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     IEnumerable<FilterAttribute> filters = actionDescriptor.GetFilterAttributes(true); 

     bool disableAntiForgery = filters.Any(f => f is DisableAntiForgeryCheckAttribute); 

     string method = controllerContext.HttpContext.Request.HttpMethod; 

     if (!disableAntiForgery 
      && String.Equals(method, "POST", StringComparison.OrdinalIgnoreCase)) 
     { 
      yield return new Filter(new ValidateAntiForgeryTokenAttribute(), FilterScope.Global, null); 
     } 
    } 
} 

[AttributeUsage(AttributeTargets.Method)] 
public sealed class DisableAntiForgeryCheckAttribute : FilterAttribute 
{ 
} 

// Usage: 
public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //**// 
     FilterProviders.Providers.Add(new AntiForgeryTokenFilterProvider()); 
     //**// 
    } 
} 

// Html Helper method 
public static class HtmlExtensions 
{ 
    public static MvcForm BeginSecureForm(this HtmlHelper html, string action, string controller) 
    { 
     var form = html.BeginForm(action, controller); 
     html.ViewContext.Writer.Write(html.AntiForgeryToken().ToHtmlString()); 

     return form; 
    } 
}