Получите 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"] in контроллеры:

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

кто-нибудь знает об этом?

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"]