如何在 MVC 4 中为自定义安全性正确自定义属性?
How to properly customize an Attribute for custom security in MVC 4?
在我公司的 Intranet Web 应用程序中,许多操作都有一个细化的自定义安全系统,我们的 MVC 控制器中的每个 action/http 方法都使用了该系统。基本上有两个枚举;一个是一组可以执行的操作(这是非常精细的;实际上每个可能的操作在枚举中都有一个相应的值),一个是我们的一组子公司。对于这个问题的上下文,我将这些枚举称为 Action
和 Company
.
我们系统中的每个用户都与一个 Company
和零个或多个 Action
相关联。在我们控制器的每个方法中,在某个地方会检查当前用户是否具有正确的 Action
和 Company
值来使用该功能。每个控制器都有一个 "UserHelper" 注入其中,其中包含 Company
和经过身份验证的用户关联的 Action
列表。
以这种方式处理,有很多代码重复,因为每个方法都对这些枚举值进行自己的检查,并在必要时对违规行为做出反应。我希望将这一切减少到 System.Attribute
或 System.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.Attribute
或 System.Web.Mvc.AuthorizeAttribute
继承。然而,我正在挣扎。我不确定如何调整 AuthorizeAttribute
以使用我们自己的内部安全实施(基于 Action
和 Company
)而不是 ASP.NET 会员系统之一。普通的旧 System.Attribute
看起来很模糊,我认为它根本不是为这种用途而设计的。我也不确定我应该如何将任何东西传递给属性中的方法。当我将属性放在方法上时,我只想指定需要 Action
和 Company
才能继续,就像上面的代码片段一样。但是,如何将这些用户的实际值传递到属性的验证方法中?
使用从 ActionFilterAttribute
而不是 AuthorizeAttribute
继承的自定义属性。您可以在此 class 中注入 UserHelper
并覆盖 OnActionExecuting
方法,并在不满足条件时设置上下文的 Result
属性。
在我公司的 Intranet Web 应用程序中,许多操作都有一个细化的自定义安全系统,我们的 MVC 控制器中的每个 action/http 方法都使用了该系统。基本上有两个枚举;一个是一组可以执行的操作(这是非常精细的;实际上每个可能的操作在枚举中都有一个相应的值),一个是我们的一组子公司。对于这个问题的上下文,我将这些枚举称为 Action
和 Company
.
我们系统中的每个用户都与一个 Company
和零个或多个 Action
相关联。在我们控制器的每个方法中,在某个地方会检查当前用户是否具有正确的 Action
和 Company
值来使用该功能。每个控制器都有一个 "UserHelper" 注入其中,其中包含 Company
和经过身份验证的用户关联的 Action
列表。
以这种方式处理,有很多代码重复,因为每个方法都对这些枚举值进行自己的检查,并在必要时对违规行为做出反应。我希望将这一切减少到 System.Attribute
或 System.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.Attribute
或 System.Web.Mvc.AuthorizeAttribute
继承。然而,我正在挣扎。我不确定如何调整 AuthorizeAttribute
以使用我们自己的内部安全实施(基于 Action
和 Company
)而不是 ASP.NET 会员系统之一。普通的旧 System.Attribute
看起来很模糊,我认为它根本不是为这种用途而设计的。我也不确定我应该如何将任何东西传递给属性中的方法。当我将属性放在方法上时,我只想指定需要 Action
和 Company
才能继续,就像上面的代码片段一样。但是,如何将这些用户的实际值传递到属性的验证方法中?
使用从 ActionFilterAttribute
而不是 AuthorizeAttribute
继承的自定义属性。您可以在此 class 中注入 UserHelper
并覆盖 OnActionExecuting
方法,并在不满足条件时设置上下文的 Result
属性。