Используя Fluent Security, я настроил доступ к веб-сайту с помощью DenyAnonymousAccess, DenyAuthenticationAccess и RequireRole. Однако, поскольку HandleSecurityAttribute
не является фильтром авторизации, вся логика для обработки DenyAnonymousAccessPolicyViolation
выполняется только после фильтра авторизации, такого как ValidateAntiForgeryToken
.
Это означает, что если срок действия билета проверки подлинности текущего пользователя истек, любое действие, украшенное ValidateAntiForgeryToken
, вызовет исключение, поскольку токен не создан для анонимного пользователя.
Так есть ли способ обойти это? В настоящее время я рассматриваю два решения:
- Создайте свой собственный фильтр авторизации, чтобы точно выполнять то, что делает
HandleSecurityAttribute
безопасность. - Используйте глобальный фильтр
Authorize
для обработки аутентификации и оставьте роль/другую политику доступа FluentSecurity.
Обновление:
Я проверил демонстрацию на github, имя пользователя и пароль для этого — dev1 и devdev. Я установил время ожидания аутентификации форм на 1 минуту. Поэтому, если вы войдете в систему и подождите одну минуту, а затем нажмете на выход, вы получите токен, не созданный для анонимного пользователя. В обычном MVC этого не произойдет, поскольку [Authorize] запускается до [ValidateAntiForgeryToken], что перенаправляет пользователя обратно на экран входа в систему.