Получите 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;
...
}
сталкиваются с той же проблемой только что, и мое решение:
-
определите 2 атрибута в классе ActionAuthorizeAttribute, например
public string ControllerName {get;set;} public string ActionName {get;set;}
-
при аннотации вашего действия контроллера укажите их, например
[ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]** public ActionResult Disable(int id) { ... }
получение области не будет работать, если вы находитесь на настраиваемом фильтре следующий будет работать, чтобы получить площадь
filterContext.RouteData.DataTokens["area"]