1

我正在编写一个 aspx 应用程序,它将在一个公共 SQL Server 数据库中托管 1000 个小客户。所有实体都将通过 Linq-To-Sql 创建和加载。

代理键(标识列)将在整个模式中用于所有表关系,因此从根客户对象开始,我应该能够使用常规 Linq 查询(SQL 连接)导航到特定客户的专有数据集。

但是从安全的角度来看,上述内容有点脆弱,所以我希望添加一层额外的租赁检查作为安全支持。我的实体模型中的所有实体都将具有一个非索引的 int TenantId 字段。

我正在从性能角度寻找有关此解决方案的批评意见。

public partial class MyLinqEntity

  partial void OnLoaded() // linq-to-sql extensibility function
  {
    if ( this.TennantId != HttpContext.Current.Session["tenantId"] )
      throw new ApplicationException("Logic error, LINQ query crossed tenantId data                      boundary");
  }

  partial void OnCreated() // linq-to-sql extensibility function
  {
    this.TennantId = HttpContext.Current.Session["tenantId"] );
  }
4

1 回答 1

0

抱歉,这主要是随机的想法……

我不喜欢依赖 HttpContext 的所有对象。

另外我不知道在会话中查找每个对象是否足够快。我认为您的速度会很好,因为数据库查找通常会比您在进程中执行的任何操作慢很多。

我倾向于使用依赖注入框架来自动创建一个具有会话范围的对象来进行检查。但是,如果您不需要其他地方的依赖注入框架,这将是过度杀戮。

由于您的所有数据库行都将具有tenantId 列,因此我希望您可以将检查移至 linq-to-sql “行读取回调”,因此您不必将其放入每个对象中。我不知道“linq-to-sql”,但是我希望您可以连接到它的查询创建框架,并在所有数据库查询中添加“where tenanted = xx”。

如果客户需要,在所有采石场中都有一个“where tenanted = xx”将允许对数据库进行分区,从而使“表扫描”等变得更便宜。

于 2009-09-03T11:25:51.887 回答