Порядок выполнения против фильтра авторизации

Используя Fluent Security, я настроил доступ к веб-сайту с помощью DenyAnonymousAccess, DenyAuthenticationAccess и RequireRole. Однако, поскольку HandleSecurityAttribute не является фильтром авторизации, вся логика для обработки DenyAnonymousAccessPolicyViolation выполняется только после фильтра авторизации, такого как ValidateAntiForgeryToken.

Это означает, что если срок действия билета проверки подлинности текущего пользователя истек, любое действие, украшенное ValidateAntiForgeryToken, вызовет исключение, поскольку токен не создан для анонимного пользователя.

Так есть ли способ обойти это? В настоящее время я рассматриваю два решения:

  1. Создайте свой собственный фильтр авторизации, чтобы точно выполнять то, что делает HandleSecurityAttribute безопасность.
  2. Используйте глобальный фильтр Authorize для обработки аутентификации и оставьте роль/другую политику доступа FluentSecurity.

Обновление:

Я проверил демонстрацию на github, имя пользователя и пароль для этого — dev1 и devdev. Я установил время ожидания аутентификации форм на 1 минуту. Поэтому, если вы войдете в систему и подождите одну минуту, а затем нажмете на выход, вы получите токен, не созданный для анонимного пользователя. В обычном MVC этого не произойдет, поскольку [Authorize] запускается до [ValidateAntiForgeryToken], что перенаправляет пользователя обратно на экран входа в систему.


person Yin    schedule 19.03.2013    source источник


Ответы (1)


У меня не было никаких проблем с этим. Убедитесь, что вы поставили HandleSecurityAttribute первым в списке фильтров!

GlobalFilters.Filters.Add(new HandleSecurityAttribute(), 0);
person Kristoffer Ahl    schedule 21.03.2013
comment
Привет, Кристоффер, проблема в том, что ValidateAntiForgeryToken это фильтр действия авторизации, который всегда запускается перед обычным ActionFilter. Порядок 0 только гарантирует, что HnadleSecurityAttribute будет выполнен перед любым другим ActionFilter неавторизованным фильтром действия. - person Yin; 22.03.2013
comment
Привет, Кристоффер, я проверил демонстрацию на github, имя пользователя и пароль для этого dev1 и devdev. Я установил время ожидания аутентификации форм на 1 минуту. Поэтому, если вы войдете в систему и подождите одну минуту, а затем нажмете на выход, вы получите токен, не созданный для анонимного пользователя. В обычном MVC этого не произойдет, поскольку [Authorize] запускается до [ValidateAntiForgeryToken], которые перенаправляют пользователя обратно на экран входа в систему. - person Yin; 22.03.2013
comment
Спасибо за публикацию демо на github. Я рассмотрю этот вопрос в следующий раз и свяжусь с вами, как только у меня появятся какие-либо новости по этому вопросу. - person Kristoffer Ahl; 11.04.2013
comment
Я попытался наследовать от AuthorizeAttribute, а также просто реализовать IAuthorizationFilter. В обоих случаях это не имело никакого значения. Вы когда-нибудь пробовали это сами, и если да, то получилось ли у вас? - person Kristoffer Ahl; 11.04.2013
comment
Еще раз посмотрел на это, и кажется, что вам нужно указать порядок, даже если мы реализуем IAuthorizationFilter. И вы должны установить его в -1, чтобы он запускался до ValidateAntiForgeryTokenAttribute. Вот что работает: filter.Add(new HandleSecurityAttribute(), -1); Я внесу это изменение в FluentSecurity и позабочусь о том, чтобы оно стало частью предстоящей бета-версии. Спасибо, что обратили на это мое внимание! - person Kristoffer Ahl; 12.04.2013