Подтвердить что ты не робот

Получите 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(), например use System.Web.HttpContextBase? если ответ "Нет", то как я могу получить эти имена и передать их атрибуту, очевидно, я не хочу добавлять каждое имя вручную, на самом деле что-то вроде ViewContext.RouteData.Values["Controller"] в контроллерах:

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

Есть ли у кого-нибудь идеи об этом?

4b9b3361

Ответ 1

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

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

  • Определите 2 атрибута в классе ActionAuthorizeAttribute, например.

    public string ControllerName {get;set;}
    public string ActionName {get;set;}
    
  • При аннотации вашего действия контроллера укажите их, например.

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

Ответ 3

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

filterContext.RouteData.DataTokens["area"]

Ответ 4

> namespace dene.kontroller {
>     public class daAttribute: AuthorizeAttribute
>     {
>         private Entities db = new Entities();
>         private readonly string[] allowedroles;
>         public daAttribute(params string[] roles)
>         {
>             this.allowedroles = roles;
>         }
> 
> 
>         protected override bool AuthorizeCore(HttpContextBase httpContext)
>         {
>             bool authorize = false;
>             foreach (var role in allowedroles)
>             {
>                 if (role == HttpContext.Current.User.Identity.Name)
>                 {
>                      
>                     if (role!= null)
>                     {
>                         authorize = true;
>                     }
>                 }
>                 
> 
>             }
>             return authorize;
>         }
> 
> 
>         protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
>         {
> 
>             FormsAuthentication.SignOut();
>             filterContext.Result = new HttpUnauthorizedResult();
>         }
> 
>     } }