Получите ActionName, ControllerName и AreaName и передайте его в атрибут ActionFilter.

Я использую настраиваемый фильтр авторизации, как показано ниже:

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"] в контроллерах:

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

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


person Saeid    schedule 02.04.2012    source источник


Ответы (4)


Вы можете получить их из 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;

    ...

}
person Darin Dimitrov    schedule 02.04.2012
comment
Вы можете получить их из RouteData. Это не лучший ответ. Теперь его отредактировали, я вернусь. - person gdoron is supporting Monica; 02.04.2012
comment
Это могло быть только в ASP.NET MVC 4, но эта область находится в rd.DataTokens [area]. - person Peter Hedberg; 11.02.2013
comment
Вам следует изменить строку var rd = httpContext.Request.RequestContext.RouteData; в var rd = HttpContext.Current.Request.RequestContext.RouteData; лучше стандартный, чем параметр :) - person Anders M.; 13.03.2014
comment
@AndersM., Я бы не стал этого делать. Это сделало бы мой код крайне недружелюбным к модульному тестированию. Я всегда предпочитаю работать с абстракциями. Не могу вспомнить, когда в последний раз использовал HttpContext.Current в своей карьере. - person Darin Dimitrov; 17.03.2014
comment
Имя области не будет содержаться в словаре значений RouteValueDictionary. Скорее, он будет содержаться в свойстве DataTokens, поэтому для получения области, которую вы хотите, rd.DataTokens [area] в виде строки - person MissingLinq; 04.06.2014

Столкнитесь с той же проблемой всего мгновение назад, и мое решение:

  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)
    {
     ...
    }
    
person Mukhtiar Zamin    schedule 18.08.2014

Получить область не получится, если вы используете настраиваемый фильтр, следующий будет работать для получения области.

filterContext.RouteData.DataTokens["area"]
person Eduardo Chávez    schedule 22.08.2017

Если получение области не помогло, вы можете получить их из RouteData следующим образом:

 string currentArea = string.Empty;
 if (rd.DataTokens.TryGetValue("area", out object area))
 {
     currentArea = area.ToString();
 }
person Mehran Mazhar    schedule 05.10.2020