如何在MVC 4中为自定义安全性正确地自定义属性

本文关键字:自定义 安全性 正确地 自定义属性 MVC | 更新日期: 2023-09-27 18:18:40

在我公司的内部网应用程序中,许多操作都有一个细粒度的自定义安全系统,该系统用于MVC控制器中的每个action/http方法。基本上有两个枚举;一个是一组可以执行的操作(这是非常细粒度的;实际上,每个可能的操作在枚举中都有相应的值),其中一个是我们的一组子公司。对于这个问题的上下文,我将称这些枚举为ActionCompany

系统中的每个用户都与一个Company和零个或多个Action相关联。在我们控制器中的每个方法中,在某个地方会检查当前用户是否拥有正确的ActionCompany值以使用该功能。每个控制器都注入了一个"UserHelper",其中包含Company和认证用户关联的Action列表。

以这种方式处理,有很多代码重复,因为每个方法都对这些枚举值进行自己的检查,并在必要时对违规做出反应。我希望将这一切减少到System.AttributeSystem.Web.Mvc.AuthorizeAttribute,我们可以把控制器或方法以统一的方式自动处理违规,而不必在方法中检查它。类似于:

public class MyController : Controller
{
    [RequireActionAndCompanyAttribute(Action = Action.MyMethod, Company = Company.AbcInc)]
    MyMethod()
    {
        // do stuff, but don't bother checking for the security values
    }
}
如前所述,我假设我可以为此目的从System.AttributeSystem.Web.Mvc.AuthorizeAttribute继承。然而,我在挣扎。我不确定如何调整AuthorizeAttribute来使用我们自己的内部安全实现(基于ActionCompany),而不是ASP。. NET会员系统。而普通的老式System.Attribute看起来如此模糊,我认为它根本不是为这种用途而设计的。我也不确定我应该如何将任何东西传递给属性中的方法。当我将属性放在方法上时,我只想指定继续执行所需的ActionCompany,就像上面的代码片段一样。但是,如何将这些用户的实际值传递到属性的验证方法中呢?

如何在MVC 4中为自定义安全性正确地自定义属性

使用从ActionFilterAttribute继承的自定义属性而不是AuthorizeAttribute。您可以在这个类中注入UserHelper并覆盖OnActionExecuting方法,并在不满足条件时设置上下文的Result属性。