27

utilizo un AuthorizationFilter personalizado como los siguientes:Obtener ActionName, ControllerName y AreaName y pasarlo en ActionFilter Atributo

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

que utilizan este filtro en la parte superior de cada acción que tengo, y para el check está autorizado, necesita Nombre de la acción, Nombre del controlador y Nombre del área. Entonces, ¿hay alguna manera de obtener estos nombres en el método AuthorizeCore() como usar System.Web.HttpContextBase? si la respuesta es NO, ¿cómo puedo conseguir este nombres y pasarlo al atributo, obviamente, no quiero añadir cada nombre con la mano, en realidad algo así 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?

Respuesta

71

Se podría buscarlos desde el 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

"Se podría buscarlos desde el RouteData" ¿No es una buena respuesta. ** Ahora ** fue editado, voy a revertir. – gdoron

+11

Esto podría ser solo en ASP.NET MVC 4, pero el área se encuentra en rd.DataTokens ["area"]. –

+0

Debe cambiar la línea var rd = httpContext.Request.RequestContext.RouteData; a var rd = HttpContext.Current.Request.RequestContext.RouteData; mejor usar el estándar que un parámetro :) –

1

se enfrentan al mismo problema hace un momento y mi solución es:

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

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. Mientras anotar su acción del controlador de los especifica, por ejemplo,

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

Conseguir la zona no funcionará si usted está en un filtro personalizado la próxima será trabajar para conseguir un área

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