script net mvc filterconfig data asp asp.net-mvc asp.net-mvc-3 authorization action-filter authorize-attribute

asp.net-mvc - filterconfig - script bundle asp net mvc



Obtenga ActionName, ControllerName y AreaName y páselo en ActionFilter Attribute (3)

Hace frente al mismo problema hace un momento y mi solución es:

  1. Defina 2 atributos en su clase ActionAuthorizeAttribute, por ejemplo

    public string ControllerName {get;set;} public string ActionName {get;set;}

  2. Al anotar su acción del controlador, especifíquelos, por ejemplo,

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]** public ActionResult Disable(int id) { ... }

Uso un filtro de autorización personalizado como los siguientes:

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); } }

Utilizo este filtro en la parte superior de cada acción que tengo, y para verificar Estoy autorizado, necesito Nombre de acción, Nombre de controlador y Nombre de área. Entonces, ¿hay alguna forma de obtener estos nombres en el método AuthorizeCore() como usar System.Web.HttpContextBase ? si la respuesta es No, entonces, ¿cómo puedo obtener estos nombres y pasarlos a los atributos? obviamente no quiero agregar cada nombre a mano, en realidad algo como ViewContext.RouteData.Values["Controller"] en los controladores:

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

¿Alguien tiene alguna idea al respecto?


Obtener el área no funcionará si está en un filtro personalizado, el siguiente funcionará para obtener un área

filterContext.RouteData.DataTokens["area"]


Podrías buscarlos en 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; ... }