Получить ActionName, ControllerName и AreaName и передать его в атрибут ActionFilter


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

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() методе, как использовать System.Web.HttpContextBase? если ответ нет, то как я могу получить эти имена и передать их в атрибут, очевидно, я не хочу добавлять каждое имя вручную, на самом деле что-то вродеViewContext.RouteData.Values["Controller"] в контроллерах:

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

Есть ли у кого-нибудь идея об этом?

3 30

3 ответа:

Вы можете получить их из 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. Определите 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)
    {
     ...
    }
    

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

filterContext.RouteData.DataTokens["area"]