2012-05-17 2 views
0

Я настроил глобальный фильтр, чтобы требовать логина для всех методов на основе Rick Anderson's article. Теперь я хочу сделать еще один шаг и потребовать, чтобы все действия разрешались только для роли «Admin», если только это не было переопределено атрибутом AllowAnonymous в статье или [Авторизовать (Роли = «Персонал»)], который затем разрешил бы «Персонал» AND «Администратор» для доступа.Глобальный фильтр роли администратора с полномочиями Role и AllowAnonymous?

Я попытался добавить к ролям в LogonAuthorize атрибут конструктора:

public LogonAuthorize() 
    { 
     this.Roles = "Admin"; 
    } 

.. но это ограничивает все действия для администратора, и я не могу переопределить с приписать Авторизоваться на действия.

ответ

4

Фигурные это вскоре после того, как: O

Я создал еще один атрибут авторизовать:

public sealed class OverrideAuthorize : AuthorizeAttribute 
{ 
} 

и использовали это в качестве теста в LogonAuthorize:

public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) 
     || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) 
     || filterContext.ActionDescriptor.IsDefined(typeof(OverrideAuthorize), true) 
     || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(OverrideAuthorize), true); 

     if (!skipAuthorization) 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 

Теперь мне просто нужно, чтобы пометить мои белые действия с OverrideAuthorize (или AllowAnonymous):

[OverrideAuthorize(Roles = "Staff, Administrator")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

Таким образом, атрибут LogonAuthorize применяется ко всем контроллерам и действиям по умолчанию и требует роли «Admin», но он разрешает только AllowAnonymous или OverrideAuthorize.

Смежные вопросы