在asp.net web api应用程序中自定义System.Web.Http.AuthorizeAttribute

时间:2016-02-08 14:21:04

标签: c# .net asp.net-mvc http asp.net-web-api

我想像这样自定义System.Web.Http.AuthorizeAttribute类:

 public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
    {

        public PermissionsEnum IsPermitted { get; set; }


        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            if (System.Web.HttpContext.Current.Session["Role"] == null) return false;
            string rol = (string)System.Web.HttpContext.Current.Session["Role"];

            if (rol == "Admin" || Roles == "Super Admin") IsPermitted = PermissionsEnum.Administration;
            else IsPermitted = PermissionsEnum.Collaboration;
            return base.IsAuthorized(actionContext);
        }
    }

  [Flags]
    public enum PermissionsEnum
    {
        Administration,
        Collaboration
    }

我在控制器中使用它:

[MyAuthorizeAttribute(IsPermitted = PermissionsEnum.Administration)]
    public class PointageController : Controller
    {
        public ActionResult GraphesEtStatistiques()
        {
            return View();
        }
         [MyAuthorizeAttribute(IsPermitted = PermissionsEnum.Administration)]
        public ActionResult Pointage()
        {
            return View();
        }
        public ActionResult Parametrage()
        {
            return View();
        }
        public ActionResult GetMessages()
        {
            MessagesRepository _messageRepository = new MessagesRepository();
            return PartialView("_MessagesList", _messageRepository.GetAllMessages());
        }
    }

我的问题是,即使Pointage我也可以访问IsPermitted=PermissionsEnum.Collaboration视图! 。

所以:

  1. 这个问题的原因是什么?
  2. 我该如何解决?

2 个答案:

答案 0 :(得分:2)

  
      
  1. 这个问题的原因是什么?
  2.   

您的问题是您的IsAuthorize方法中的逻辑不正确。

  
      
  1. 我该如何解决?
  2.   

...设置断点并调试IsAuthorized方法。

通过查看您提供的代码,以及当前结构化的方式,IsPermitted属性是多余的。在装饰控制器时将它传递给属性,但是在IsAuthorized方法中,您对注入的值不做任何操作。相反,您可以单独设置它。然后,您调用基本AuthorizeAttribute的{​​{1}}方法,并且基本属性没有您的枚举概念。

我无法确定这是否会解决您的要求,但这至少会为您提供一个可以构建的功能IsAuthorized方法:

IsAuthorized

答案 1 :(得分:1)

最重要的是,如果你在控制器上设置[MyAuthorizeAttribute(IsPermitted = PermissionsEnum.Administration)],这意味着在该类中实现的所有操作都将使用相同的授权,即使您为每种方法设置了其他授权......

如果要为每个操作自定义授权,则必须删除所有控制器上的属性。

授权方法:

protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (System.Web.HttpContext.Current.Session["Role"] == null) return false;
        string rol = (string)System.Web.HttpContext.Current.Session["Role"];

        var userPermittedFlag = (rol == "Admin" || rol == "Super Admin") ? PermissionsEnum.Administration : PermissionsEnum.Collaboration;
        return userPermittedFlag == this.IsPermitted;
    }