2014-11-01 3 views
2

Это мой CustomAuthorizeAttribute класс:Как переопределить глобальный атрибут AuthorizeAttribute, когда добавить тот же атрибут AuthorizeAttribute для некоторого Action MVC?

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 

     public string ControllerName { get; set; } 


     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (ControllerName != "pass") 
      { 
      // stop or redirect 
      } 

     } 
} 

зарегистрировать его глобальные фильтры для все контроллера может использовать:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
     filters.Add(new AdminAuthorizeAttribute()); 
} 

Для некоторых конкретных действий я добавить его Пары ControllerName:

[AdminAuthorize(ControllerName="pass")] 
public ActionResult Index() 
{ 
     return View(); 
} 

Но проблема теперь в OnAuthorization(), ControllerName всегда получает null при выполнении конкретного действия.

Это потому, что я не могу использовать глобальный authorizeAttribute и такое же Attibute для какого-либо конкретного действия вместе ?? Зачем? Я всегда думал, что если добавить определенный атрибут AuthorizeAttribute для конкретного действия и добавить атрибут в глобальный фильтр, конкретное действие получит приоритет высоты.

Update1:

Если источник проблемы является 2 разрешено все выполнить. то как сделать переопределить глобальный авторизованный фильтр, когда я добавлю тот же атрибут AuthorizeAttribute для некоторых действий? (Только друг пары, я просто хочу игнорировать глобальную уполномоченные, когда я добавляю один для некоторых действий)

+0

Вы можете изменить свойство Order атрибута вручную, чтобы оно было fir сначала. –

ответ

1

Изменения к заказному собственности на пользовательском атрибуте, так что он будет уволен первым:

[AdminAuthorize(ControllerName="pass", Order=999)] 
public ActionResult Index() 
{ 
     return View(); 
} 

это пример бездействия.

И да, вы можете переопределить глобальные фильтры таким образом.

+0

спасибо. но могу ли я просто установить порядок для глобального фильтра? то мне не нужно устанавливать порядок для каждого конкретного действия. – qakmak

+0

Да, задайте значение по умолчанию в конструкторе по умолчанию и создайте конструктор перегрузки с настраиваемым значением –

+0

Я использую глобальный фильтр для использования '' filters.Add (новый AdminAuthorizeAttribute(), 1); '' выглядит как порядковый номер min приоритет роста, пожалуйста, отредактируйте свой ответ. но теперь проблема в том, что он не переопределяет глобальный фильтр, все два фильтра будут выполняться ..... – qakmak

2

Я сделал это с комбинацией собственности заказа и маркировками в контекстных элементах, что запрос был уполномочен на мои атрибуты:

public class AuthorizeByRolesAttribute : AuthorizeAttribute 
{ 
    private const string AuthorizedContextItemName = "_AuthorizedByRoles"; 

    public AuthorizeByRolesAttribute (params string[] roles) 
    { 
     this.Order = 0; 
     this.Roles = string.Join (",", roles); 
    } 

    public override void OnAuthorization (AuthorizationContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] != null) 
      return; 

     base.OnAuthorization (filterContext); 

     filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] = this.Roles ?? string.Empty; 
    } 
} 

В глобальной конфиге:

filters.Add (new AuthorizeByRolesAttribute ("Admin"), 255); 

В контроллере просто :

[AuthorizeByRoles ("NotAdminButCanAccess")] 
public class MyController : Controller 
... 
Смежные вопросы