我想像这样自定义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
!!!! .
所以:
- 这个问题的原因是什么?
- 我该如何解决它?
- 这个问题的原因是什么?
您的问题是您在IsAuthorize
方法中的逻辑不正确。
- 我该如何解决它?
。设置断点并调试 IsAuthorized 方法。
通过查看您提供的代码及其当前结构的方式,IsPermitted
属性是多余的。 在修饰控制器时将其传递到属性中,但在 IsAuthorized
方法中,对注入的值不执行任何操作。相反,您可以独立设置它。 然后你调用基AuthorizeAttribute
的IsAuthorized
方法,基属性没有枚举的概念。
我不确定这是否会解决您的域要求,但这至少会为您提供一种可以从中构建的功能性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;
}