在 ASP.NET MVC 应用程序中实现细粒度安全(即授权)的最佳机制是啥?
Posted
技术标签:
【中文标题】在 ASP.NET MVC 应用程序中实现细粒度安全(即授权)的最佳机制是啥?【英文标题】:What is the best mechanism to implement granular security (i.e. authorization) in an ASP.NET MVC application?在 ASP.NET MVC 应用程序中实现细粒度安全(即授权)的最佳机制是什么? 【发布时间】:2010-11-21 20:40:35 【问题描述】:假设一位高速开发人员的任务是构建一个可供许多不同人访问的银行应用程序。每个人都希望访问他或她自己的帐户信息,但不希望其他人访问它。我想知道在 MVC 应用程序中限制访问的最佳做法,以便只有拥有信息的用户(或管理员)才能访问它。
Authorize
属性允许我们按角色进行限制。虽然这是一个起点,但似乎任何经过身份验证的用户都可以访问任何其他用户的信息。
ActionFilters 似乎提供了更精细控制的选项,并且可能用于完成任务。但是,我不清楚它们是否是推荐的方法。
欢迎任何指导或想法。
【问题讨论】:
什么是“高速开发者”? 【参考方案1】:ActionFilter 可能是一个很好的起点,但根据您的架构,您可能需要考虑外围防御是否足够好。
如果您实际上是在构建单层 ASP.NET MVC 应用程序(并且可能有完全合理的理由这样做),ActionFilter 将提供足够好的防御,同时非常易于应用。
另一方面,如果您的应用程序是多层应用程序,则深度防御更为合适。在这种情况下,您应该考虑在域模型中应用授权逻辑,或者甚至在数据访问层中应用授权逻辑。这将确保如果您基于相同的域模型(例如 Web 服务)开发另一个应用程序,授权逻辑仍然适用。
无论您做什么,我都强烈建议您将实际授权实现基于 IPrincipal。
在更具体的说明中,您在此处询问的内容最好使用基于 ACL 的授权进行建模:在每个用户配置文件上设置一个 ACL,默认情况下仅授予用户他/她自己和管理员的访问权限。如果/当您以后需要扩展应用程序以允许对其他用户的配置文件进行委派访问(我不知道在您的特定情况下这是否遥不可及),您只需向 ACL 添加一个新条目即可。
在这种情况下,评估访问涉及检索所请求资源的 ACL 并检查当前用户 (IPrincipal) 是否包含在该 ACL 中。这样的操作很可能涉及进程外操作(在数据库中查找 ACL),因此通过将其隐藏在 ActionFilter 后面将其作为应用程序的隐式部分听起来可能会隐藏一些性能问题。在这种情况下,我会考虑让授权模型更加明确/可见。
【讨论】:
马克,这是一个绝妙的策略!谢谢!在我之前的大多数项目中,我们编写了自己的安全组件来管理权限、用户、组、角色等,并绕过了 ASP.NET 成员体系结构,专门用于在较低级别进行访问控制。我曾希望有一种在 MVC 中实现权限的方法比滚动我自己的方法更简单。自从我的第一篇文章以来,我最终还是写了它,但采用了混合方法。我使用 ASP.NET 的成员资格和角色提供程序进行基本权限和角色管理,但开发了我自己的组和权限管理以实现更好的精细控制。 当用户尝试(在控制器上)执行操作时,我会检查他的角色以确保他具有“基本”访问权限。如果没有,我重定向他。如果他确实有基本访问权限,我会调用一个更精细的函数来检查他对特定对象类型和/或他尝试访问的实例的实际权限。现在,我还没有将它实现为一个动作过滤器,但我只是在每个动作中调用它。我会尽快重构它。 很高兴您可以使用答案 - 您可能还想查看这个有点相关的答案:***.com/questions/1335315/…【参考方案2】:根据我的观点,如果你有单层应用程序,那么授权是最好的选择,而且 actionfilter 更好,更易于使用。但是如果您的应用程序是多层的,那么您必须使用访问控制列表 [ACL]。
【讨论】:
【参考方案3】:我认为您说得对,ActionFilter 方法是一种合理的方法。
我将创建一组继承自 AuthorizeAttribute 的自定义操作过滤器。
除了 Authorize 属性的功能之外,您还可以干净利落地实施更严格的仅所有者策略。
HTH,
丹
【讨论】:
谢谢丹!您对实施“更严格的仅限所有者政策”有何建议?这是否类似于 Mark 上面描述的内容? 正是安东尼,最后一段特别是马克的回答。我会从 Authorize 过滤器派生您的自定义过滤器,因为您将需要一个授权的 IPrincipal 来检查 ACL。【参考方案4】:如果您想将授权外部化,可以查看基于 XACML 的实现。
【讨论】:
以上是关于在 ASP.NET MVC 应用程序中实现细粒度安全(即授权)的最佳机制是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里可以找到在 ASP .NET MVC2 中实现密码恢复的 C# 示例代码