Как переопределить ValidateAntiForgeryToken на уровне метода?

У меня есть атрибут ValidateAntiForgeryToken, применяемый на уровне класса. Как показано в приведенном ниже коде.

[ValidateAntiForgeryToken, Authorize(Roles = "SuperUser")]
public class ManageController : BaseController
{
...
}

Этот класс имеет несколько методов, которые принимают данные POST, и несколько методов, которые доступны для операции GET. Я хотел бы отключить метод ValidateAntiForgeryToken для GET без изменения атрибута уровня класса. Я знаю, что могу сделать это, изменив все POST методы и применив ValidateAntiForgeryToken только к ним. Но я надеюсь, что это простой способ.

Точно так же, как атрибут Authorize работает вместе с AllowAnonymous, где вы можете применить атрибут Authorize на уровне класса, но затем можете изменить его на уровне метода, применив AllowAnonymous.

[Authorize]
public class AccountController : BaseController
{
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {            
            return View();
        }
}

person ndd    schedule 13.04.2016    source источник
comment
посмотрите на эту ссылку stackoverflow.com /questions/5213345/, в основном вы можете создать фильтр, добавить фильтр в класс, а затем фильтр добавит ValidateAntiForgeryToken только к методам публикации   -  person Daniel Gpe Reyes    schedule 13.04.2016


Ответы (1)


Я думаю, что этот пост поможет вам. http://prideparrot.com/blog/archive/2012/7/securing_all_forms_using_antiforgerytoken

Добавив собственный IAuthorizationFilter, вы можете пропустить проверку GET

public class AntiForgeryAttribute: IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext authorizationContext)
    {
        if (authorizationContext.RequestContext.HttpContext.Request.HttpMethod != "POST")
            return;

        new ValidateAntiForgeryTokenAttribute().OnAuthorization(authorizationContext);
    }
}

Или позже в статье объясняется, как создать настраиваемый атрибут, чтобы пропустить проверку некоторых действий.

person Sergio Robaudo    schedule 12.08.2016
comment
Привет, добро пожаловать в stackoverflow. Пожалуйста, опишите ответы подробнее. когда у вас есть ссылка в вашем ответе, вполне вероятно, что страница будет удалена, и ваш ответ станет бесполезным для других людей в будущем. - person Ashkan Sirous; 12.08.2016
comment
Может я не правильно следую статье и ошибаюсь. Я загрузил код на dropbox.com/s/h5sbaoysbb0ayt7/AntifForgerySkip.zip ?dl=0 не могли бы вы взглянуть? Я также пытался использовать базовый класс. - person ndd; 15.08.2016