我想像这样自定义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
视图! 。
所以:
答案 0 :(得分:2)
- 这个问题的原因是什么?
醇>
您的问题是您的IsAuthorize
方法中的逻辑不正确。
- 我该如何解决?
醇>
...设置断点并调试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;
}