Централизованная авторизация контроллеров и действий (ASP.NET MVC 3)

Существуют ли какие-либо возможные проблемы с безопасностью или подводные камни в пользовательском AuthorizeAttibute (зарегистрированном глобально) для применения авторизации на основе типа контроллера и вызываемого действия?

например (не настоящий код)

string controllerFullName=_filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;

string minRequiredRole = GetControllerMinRequiredRole(controllerFullName);

if(User.MeetsRoleRequirement(minRequiredRole))
{
     //give access
}
else
{
    //no you're not allowed
}

person enamrik    schedule 09.02.2012    source источник


Ответы (1)


Основная проблема связана с кэшированием авторизации, поэтому есть несколько вещей, которые нужно знать. Посмотрите ссылки, которые я разместил здесь:

Создание AuthorizeAttribute — что мне нужно знать?

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

person Adam Tuliper - MSFT    schedule 09.02.2012
comment
так что, если я наследую от AuthorizeAttrbute и вызываю base.OnAuthorized? Должен ли я по-прежнему беспокоиться о проблеме кэширования? (сейчас я только переопределяю OnAuthorized, чтобы получить AuthorizationContext. Я не знаю, как получить AuthorizationContext в AuthorizeCore, так как он передал HttpContextBase) - person enamrik; 10.02.2012
comment
вот интересный фрагмент (см. часть кеша): diaryofaninja.com/blog/2011/07/24/ вы используете собственную авторизацию? Если да, то обратите внимание, что они здесь делают - person Adam Tuliper - MSFT; 10.02.2012
comment
Я не пишу свой собственный, а наследую атрибут AuthorizeAttrbute по умолчанию. Таким образом, кажется, вызывая base.OnAuthorized, я получаю хак кэширования (похоже, хак является частью основного класса AuthorizeAttrbute). Похоже, я в безопасности. Если вам нечего добавить, спасибо за ответ - person enamrik; 10.02.2012