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;
}
}
[Chameleon Formları] 'na (https://github.com/MRCollective/ChameleonForms) göz attınız mı? – Bringer128
@ Bringer128 bunun için teşekkürler, ancak bu tek şey için bir çerçeve kullanmaya eğilimli değil. – Ahsan
[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) –