Как я могу установить ValidateAntiForgeryToken глобально

Безопасность прежде всего.

Лучшие практики MVC рекомендуют добавлять атрибут [ValidateAntiForgeryToken] к каждому действию [HttpPost].

Как я могу применить это правило в одной уникальной точке приложения?


person Fabrizio    schedule 06.03.2011    source источник


Ответы (1)


Следующий класс позволяет сделать это с помощью FilterProvider.

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
    List<Filter> result = new List<Filter>();

    string incomingVerb = controllerContext.HttpContext.Request.HttpMethod;

    if (String.Equals(incomingVerb, "POST", StringComparison.OrdinalIgnoreCase))
    {
        result.Add(new Filter(new ValidateAntiForgeryTokenAttribute(), FilterScope.Global, null));
    }

    return result;
}

Чтобы использовать вышеуказанный класс, добавьте это к методу RegisterGlobalFilters в файле global.asx:

...    
FilterProviders.Providers.Add(new AntiForgeryTokenFilterProvider ());
..

При этом каждый [HttpPost] будет проверять, находится ли Html.AntiForgeryToken() в представлении.

person Fabrizio    schedule 06.03.2011
comment
Наследуется ли ваш поставщик фильтров от какого-либо базового класса? - person Paul; 15.06.2011
comment
Код создаст список для каждого запроса к приложению. Его можно улучшить, используя yield: yield return new Filter(new ValidateAntiForgeryTokenAttribute(), FilterScope.Global, null); - person ShadowChaser; 01.07.2012
comment
ссылка на полный класс для ясности: code.google.com/p/vnecoo/source/browse/trunk/Code/Oas2011/OAS/ - person Jon; 07.11.2013