【问题标题】:Applying fine-grained security to an existing application将细粒度的安全性应用于现有应用程序
【发布时间】:2011-11-15 17:47:48
【问题描述】:

我在 SQL Server 上使用 EF Code First 继承了一个相当大且复杂的 ASP.NET MVC3 Web 应用程序。它使用带有数据库身份验证的 ASP.NET 成员角色。控制器操作由派生自 AuthorizeAttribute 的属性保护,这些属性将角色映射到操作。有更精细的扩展方法,例如向特定角色显示特定小部件。这很好用,我对当前的安全模型有很好的了解。

我被要求在数据级别提供更细粒度的安全性。例如,“客户”用户只能看到与他们自己相关联的数据(整个数据库),而不能看到与其他客户相关的数据。问题是“客户”只是 5 种不同类型中的一种,它们有自己的特定限制(9 种角色中的每一种都是这 5 种类型中的一种)。

我能想到的最好的事情是遍历所有数据存储库,并使用针对每种用户类型的过滤器扩展每个 LINQ 语句/查询。即使我有时间,这似乎也不是最优雅的方式。

有什么建议吗?我真的不知道从哪里开始,所以任何事情都会有所帮助。

非常感谢。

【问题讨论】:

  • 这是一个很好的开始方式,但是如果您需要拥有可以查看其他人数据的超级用户,这将变得更加复杂。希望所有查询都通过某种服务层完成。这样就很容易在任何复杂程度的情况下加入安全性。不要忘记保护更新。 (用户 A 不能修改用户 B 的数据。)

标签: asp.net-mvc c#-4.0 entity-framework-4


【解决方案1】:

必须在查询中执行数据驱动的安全性。在项目的后期添加这个真的很耗时。不是因为编程,而是因为测试。如果管理层有这个要求,他们必须接受。

您可以从重构一些基本查询开始。每个查询都必须访问一些DbSet,因此不要访问DbSet,而是访问一些在该集合上应用安全性的辅助方法。您可以使用在派生上下文中公开的DbSets,或者您甚至可以尝试派生自己的DbSets 并重新实现IQueryalbe.Expression(显式实现)以将您的过滤逻辑直接添加到集合中。

真正的复杂性始于惰性加载和急切加载。 EF 不提供过滤延迟或急切加载的数据的方法。使用精心设计的聚合,您不需要跨客户延迟加载和急切加载。如果您需要它,您将不得不重构该部分代码以使其正常工作(这不仅仅是向查询添加一些条件)。

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2011-12-20
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2010-09-21
    • 2017-04-15
    • 2011-11-03
    • 2012-08-14
    相关资源
    最近更新 更多