2013-10-07 2 views
0

Я пытаюсь создать систему авторизации, которая позволяет мне использовать различные данные из типа Controllers Type и Action MethodInfo, чтобы проверить, имеет ли пользователь права доступа к этому разделу моей системы.Тип и действие контроллера MVC4 от AuthorizeAttribute AuthorizeCore

public class NewAuth : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var Type = ControllerTypeHere; 
     var MethodInfo = ActionMethodInfoHere; 
    } 
} 

Есть ли способ получить тип и информация о методе действия или контроллер, который в настоящее время пытается получить доступ?

Я могу предоставить любую другую информацию, если необходимо.

ответ

3

OnAuthorization - это хороший способ получить информацию о запросе.

Давайте сделаем несколько изменений в вашем коде.

public class NewAuth : AuthorizeAttribute 
{ 
    private Type _type; 
    private ActionDescriptor _actionDescriptor; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     _type = filterContext.Controller.GetType(); 
     _actionDescriptor = filterContext.ActionDescriptor; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // use _type 
     // use _actionDescriptor 
     return true; 
    } 
} 

OnAuthorization обжигают первый, поэтому переменные будут установлены, когда AuthorizationCore называется. Вы заметите, что я изменил концепцию MethodInfo на ActionDescriptor. Они не взаимозаменяемы, но ActionDescriptor - это полезный способ получить некоторую общую информацию о действии, таком как ActionName, FilterAttributes, CustomAttributes и Parameters.

Если требуется MethodInfo, это, безусловно, возможно, но это может быть немного сложнее. Помните, что ваш контроллер может иметь несколько действий с одинаковым именем; версия HttpGet, HttpPost версия и т.д.

В этом примере я ищу для [HttpPost] версия действия:

var methodInfo = _type.GetMethods() 
    .SingleOrDefault(mi => mi.Name == filterContext.ActionDescriptor.ActionName && 
     mi.GetCustomAttributes(false).Any(attr => attr is HttpGetAttribute)); 
+0

Это работает фантастически! Большое спасибо. – JakeJ

+2

Теперь я не знаю, вызвана ли моя ситуация чем-то другим, но если у кого-то есть проблемы с этим решением - попробуйте назначить частные поля перед вызовом 'base.OnAuthorization (filterContext);', я испытал, что иначе 'AuthorizeCore' будет генерировать NullException, потому что они не были установлены вовремя. В любом случае +1 для этого решения! –

+2

Да, это на самом деле назад; base.OnAuthorization вызывает AuthorizeCore, поэтому в OnAuthorization вы должны выполнить свою настройку прежде, чем вызвать базовую версию –

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