Получите ActionName, ControllerName и AreaName и передайте его в Атрибут ActionFilter - PullRequest
34 голосов
/ 02 апреля 2012

Я использую пользовательский фильтр авторизации, как показано ниже:

public class ActionAuthorizeAttribute : AuthorizeAttribute {

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {

        if(!httpContext.User.Identity.IsAuthenticated)
            return false;

        if(IsUserExcluded())
            return false;
        else
            return IsRoleAuthorize(httpContext);
    }
}

Я использую этот фильтр в верхней части каждого моего действия, и для проверки он авторизован, необходимо указать Имя действия, Имя контроллера и Имя области. Так есть ли способ получить эти имена в методе AuthorizeCore(), например use System.Web.HttpContextBase? если ответ «Нет», то как я могу получить эти имена и передать их атрибуту, очевидно, я не хочу добавлять каждое имя вручную, на самом деле что-то вроде ViewContext.RouteData.Values["Controller"] в контроллерах:

[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)]
public ActionResult Index() {
    return View();
}

Кто-нибудь имеет представление об этом?

Ответы [ 3 ]

82 голосов
/ 02 апреля 2012

Вы можете получить их из RouteData:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
    var rd = httpContext.Request.RequestContext.RouteData;
    string currentAction = rd.GetRequiredString("action");
    string currentController = rd.GetRequiredString("controller");
    string currentArea = rd.Values["area"] as string;

    ...

}
1 голос
/ 18 августа 2014

Только что столкнулся с той же проблемой, и мое решение:

  1. Определите 2 атрибута в вашем классе ActionAuthorizeAttribute, например

    public string ControllerName {get;set;}
    public string ActionName {get;set;}
    
  2. Во время аннотирования ваших действий контроллера укажите их, например,

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]**
    public ActionResult Disable(int id)
    {
     ...
    }
    
0 голосов
/ 22 августа 2017

Получение области не будет работать, если вы используете пользовательский фильтр, следующий будет работать, чтобы получить область

filterContext.RouteData.DataTokens["area"]
...