Примененный глобально IgnoreAntiforgeryTokenAttribute не отключает ValidateAntiForgeryToken - PullRequest
1 голос
/ 17 мая 2019

У меня есть конечная точка с этими атрибутами:

[HttpPost]
[ValidateAntiForgeryToken]
[Route("[controller]/[action]")]

Когда я применил IgnoreAntiforgeryTokenAttribute глобально

.AddMvc(opts =>
{
    opts.Filters.Add(typeof(CustomExceptionFilter));
    opts.Filters.Add(new IgnoreAntiforgeryTokenAttribute());
    // or
    opts.Filters.Add(typeof(IgnoreAntiforgeryTokenAttribute));
})

Это не отключило это [ValidateAntiForgeryToken], но когда я сделал что-то подобное:

[HttpPost]
[ValidateAntiForgeryToken]
[IgnoreAntiforgeryToken]
[Route("[controller]/[action]")]

тогда он был отключен, почему?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Для встроенного ValidateAntiForgeryToken вы не можете отключить его с помощью IgnoreAntiforgeryTokenAttribute в Startup.cs.Вы можете изменить Порядок исполнения по умолчанию .

В качестве обходного пути вы можете реализовать свой собственный ValidateAntiforgeryTokenAuthorizationFilter, например

public class CustomValidateAntiforgeryTokenAuthorizationFilter : ValidateAntiforgeryTokenAuthorizationFilter
{
    public CustomValidateAntiforgeryTokenAuthorizationFilter(IAntiforgery antiforgery, ILoggerFactory loggerFactory)
        :base(antiforgery, loggerFactory)
    {
    }
    protected override bool ShouldValidate(AuthorizationFilterContext context)
    {
        var filters = context.Filters;
        if (filters.Where(f => f.GetType() == typeof(IgnoreAntiforgeryTokenAttribute)) != null)
        {
            return false;
        }
        else
        {
            return base.ShouldValidate(context);
        }
    }
}

, и зарегистрироваться по ValidateAntiforgeryTokenAuthorizationFilter, например

services.AddMvc(options => {
    options.Filters.Insert(0, new IgnoreAntiforgeryTokenAttribute());

    options.Filters.Add(typeof(WebApiExceptionFilter)); // by type
});
services.AddScoped<ValidateAntiforgeryTokenAuthorizationFilter, CustomValidateAntiforgeryTokenAuthorizationFilter > ();
1 голос
/ 17 мая 2019

Попробуйте вставить фильтр вверху списка, чтобы он имел приоритет над существующими фильтрами, такими как AutoValidateAntiforgeryTokenAttribute:

opts.Filters.Insert(0, new IgnoreAntiforgeryTokenAttribute());
...