在 Web API 应用程序中自定义 System.Web.Http.AuthorizeAttribute asp.ne

本文关键字:Web Http AuthorizeAttribute ne System asp 自定义 API 应用程序 | 更新日期: 2023-09-27 18:33:45

我想像这样自定义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. 我该如何解决它?

在 Web API 应用程序中自定义 System.Web.Http.AuthorizeAttribute asp.ne

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

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

  1. 我该如何解决它?

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

通过查看您提供的代码及其当前结构的方式,IsPermitted属性是多余的。 在修饰控制器时将其传递到属性中,但在 IsAuthorized 方法中,对注入的值不执行任何操作。相反,您可以独立设置它。 然后你调用基AuthorizeAttributeIsAuthorized方法,基属性没有枚举的概念。

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

protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (System.Web.HttpContext.Current.Session["Role"] == null) return false;
        string role = (string)System.Web.HttpContext.Current.Session["Role"];
        if ((role == "Admin" || role == "Super Admin") //recycling your condition
           && IsPermitted == PermissionsEnum.Administration) return true;
        if ((role == "Collaborator"
           && IsPermitted == PermissionsEnum.Collaborator) return true;
        return false;
    }
最重要的是

,如果您在控制器上设置了[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;
    }