Могу ли я получить доступ к своему контроллеру / действию / глаголу из моего производного AuthorizeAttribute? - PullRequest
2 голосов
/ 18 ноября 2009

В качестве теоретического упражнения, чтобы помочь мне изучить все входы и выходы модели членства в отношении MVC, я хочу выяснить, могу ли я загружать разрешения из внешнего ресурса, для целей моего прототипа у меня есть квартира файл с таким списком:

Controller1,Method1,Get,Anonymous
Controller1,Method1,Post,User,Administrator
Controller2,Method1,Get,Administrator
Controller2,Method1,Post,Administrator
Controller2,Method2,Get,User,Editor,Administrator
Controller2,Method2,Post,Editor,Administrator

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

У меня есть действие контроллера:

[CustomAuthorize]
public ActionResult Index()
{
    /* Do stuff */
}

У меня также есть свой компонент авторизации:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        /* How do I access which Controller/Action/Verb fired this? */
    }
}

Чтобы на лету определить, какие роли имеют доступ к этому контроллеру / действию / глаголу, мне нужно определить, какой контроллер / действие / глагол называется атрибутом CustomAuthorize.

Я знаю, что могу добавить свойства в свой класс следующим образом:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Controller { get; set; }
    public string Action { get; set; }
    public string Verb { get; set; }
}

А затем вызвать мой атрибут, используя:

[CustomAuthorize(Controller="Home",Action="Index",Verb="Get")]
public ActionResult Index()
{
}

Но это похоже на головную боль от обслуживания. Было бы хорошо, если бы я мог просто использовать [Authorize], и чтобы мой метод CustomAuthorize.AuthorizeCore определял, какой контроллер / действие / глагол ссылался на него из метода AuthorizeCore.

Возможно ли это? Если да, может ли кто-нибудь указать мне правильное направление информации о том, как мне этого добиться?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2009

Возможно, вы захотите взглянуть на переопределение OnAuthorization. Он получает параметр AuthorizationContext, который имеет ссылку на Controller и RouteData. Взгляните, однако, на то, что делает стандартный AuthorizeAttribute, особенно в отношении кеширования. Вы можете найти некоторые идеи в статье, которую я написал в моем блоге о настройке авторизации в MVC .

3 голосов
/ 18 ноября 2009

Попробуйте вместо этого переопределить OnAuthorization.

public class TestAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        string controllerName = filterContext.RouteData["controller"];
        string actionName = filterContext.RouteData["action"];
        string verb = filterContext.HttpContext.Request.HttpMethod;

        // .. do your processing
        // if fail...
        filterContext.Result = new HttpUnauthorizedResult();

        base.OnAuthorization(filterContext);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...