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:
Defina 2 atributos en su clase ActionAuthorizeAttribute, por ejemplo
public string ControllerName {get;set;} public string ActionName {get;set;}
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;
...
}