11

假设一个高速开发人员的任务是构建一个可供许多不同人访问的银行应用程序。每个人都希望访问他或她自己的帐户信息,但不希望其他人访问它。我想知道在 MVC 应用程序中限制访问的最佳实践,以便只有拥有信息的用户(或管理员)才能访问它。

Authorize属性允许我们按角色进行限制。虽然这是一个起点,但似乎任何经过身份验证的用户都可以访问任何其他用户的信息。

ActionFilters 似乎提供了更精细控制的选项,并且可能用于完成任务。但是,我不清楚它们是否是推荐的方法。

欢迎任何指导或想法。

4

4 回答 4

10

ActionFilter 可能是一个很好的起点,但根据您的架构,您可能需要考虑外围防御是否足够好。

如果您实际上是在构建单层 ASP.NET MVC 应用程序(并且可能有完全合理的理由这样做),ActionFilter 将提供足够好的防御,同时非常易于应用。

另一方面,如果您的应用程序是多层应用程序,则深度防御更为合适。在这种情况下,您应该考虑在域模型中应用授权逻辑,或者甚至在数据访问层中应用授权逻辑。这将确保如果您曾经基于相同的域模型(例如 Web 服务)开发另一个应用程序,授权逻辑仍然适用。

无论您做什么,我都强烈建议您将实际授权实现基于 IPrincipal。

在更具体的说明中,您在此处询问的内容最好使用基于 ACL 的授权建模:在每个用户配置文件上设置一个 ACL,默认情况下仅授予用户他/她自己和管理员的访问权限。如果/当您以后需要扩展应用程序以允许对其他用户的配置文件进行委派访问(我不知道在您的特定情况下这是否遥不可及),您只需向 ACL 添加一个新条目即可。

在这种情况下,评估访问涉及检索所请求资源的 ACL 并检查当前用户 (IPrincipal) 是否包含在该 ACL 中。这样的操作很可能涉及进程外操作(在数据库中查找 ACL),因此通过将其隐藏在 ActionFilter 后面将其作为应用程序的隐式部分听起来可能会隐藏一些性能问题。在这种情况下,我会考虑使授权模型更加明确/可见。

于 2009-08-22T08:37:13.137 回答
1

According to my view if you have single layer application then authorization is best option and also actionfilter is much better and simpler to use. But if your application is multilayer then you Mus USE Access Control list [ACL].

于 2011-01-12T10:53:24.613 回答
0

我认为您说得对,ActionFilter 方法是一种合理的方法。

我将创建一组继承自 AuthorizeAttribute 的自定义操作过滤器。

除了 Authorize 属性的功能之外,您还可以干净利落地实施更严格的仅所有者策略。

高温下,

于 2009-08-22T06:34:12.200 回答
0

如果您想要外部化授权,您可以查看基于 XACML 的实现。

于 2011-11-15T19:43:18.390 回答