【问题标题】:How to properly customize an Attribute for custom security in MVC 4?如何在 MVC 4 中为自定义安全性正确自定义属性?
【发布时间】:2016-01-20 23:15:33
【问题描述】:

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

我们系统中的每个用户都与一个Company 和零个或多个Actions 相关联。在我们的控制器中的每个方法中,都会检查当前用户是否具有正确的ActionCompany 值来使用该功能。每个控制器都注入了一个“UserHelper”,其中包含Company 和与经过身份验证的用户关联的Actions 列表。

以这种方式接近它,有很多代码重复,因为每个方法都对这些枚举值进行自己的检查,并在必要时对违规行为做出反应。我希望将这一切减少到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 需要继续,就像上面的代码sn-p 一样。但是,如何将这些用户的实际值传递给属性的验证方法?

【问题讨论】:

  • “UserHelper”是如何注入的?
  • @DanielGpeReyes - 到目前为止,每个控制器都将 UserHelper 通过参数注入到其构造函数中,并将其存储在私有只读字段中。
  • 你能发布你的 UserHelper 吗?

标签: c# asp.net-mvc asp.net-mvc-4 custom-attributes


【解决方案1】:

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

【讨论】:

  • 在哪里注入 UserHelper?
  • 你现在如何将它注入你的控制器?你使用什么样的框架?你可以直接从容器中解决它吗?否则,您可以通过 ActionExecutingContext 的 Controller 属性从控制器获取它
  • 我们正在使用 Unity 依赖注入框架。我不确定如何从容器中解决某些问题。 ActionExecutingContext 的 Controller 属性没有 UserHelper。
  • 在 MVC 中解决 Unity 容器的依赖关系非常简单:使用 DependencyResolver.Current.GetService<IInterfaceToResolve>();。我认为这对你有用。
  • 要使Controller 属性起作用,您需要将其强制转换为将 UserHelper 包装在属性中的特定控制器。您可能会考虑将该属性添加到基控制器类并从该基类继承特定控制器。但是用 DI 方法做起来要干净得多。
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多