在多租户数据架构中,实现租户过滤视图的最佳方法是什么?

3
我正在使用ASP.Net MVC 2和SQL Server数据库实现SaaS应用程序。我正在使用共享租户方法。
到目前为止,我已经发现了两种过滤数据的方法:
选项1:http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_tvf 使用每个租户的SQL登录。因此,在视图中使用SUSER_SID()作为过滤器。
选项2:http://blogs.imeta.co.uk/jyoung/archive/2010/03/22/845.aspx 在Context_Info中存储租户ID。因此,在视图中使用从Context_Info读取租户ID的SQL函数作为过滤器。
请帮我选择适当的选项。
谢谢。
2个回答

8
我认为这归结为安全模型的争论。一个数据库管理员可能会坚持你采用前者。我更加实际,可能会从应用层将租户ID传递到我的存储过程或查询中。
我会通过大量的单元测试来支持这一点,确保一个租户永远不会看到另一个租户的数据,并且我只会在服务器上的会话或类似位置存储当前租户,而不是在cookie、URL或任何其他可以被客户端攻击的地方。
这样做使添加新租户变得更加容易,因为不需要进行数据库配置。
当然,会话也可能被攻击,所以你需要采取所有预防措施,确保无论你如何在服务器上存储租户ID,它都不会受到欺骗等攻击。

我同意你的观点:选项1不够灵活,因为它基于每个用户都存在于域级别的假设。选项2允许您拥有仅作为某个用户表中行存在的用户。这使您可以通过与该租户域的AD同步来填充用户表。 - Steven Sudit
存储租户ID的会话选项不在我的考虑范围内,您能否详细说明如何实现?我将把租户站点URL映射到租户ID。您会在哪个层次中设置租户ID会话?您会将其存储在应用程序缓存中吗?谢谢。 - AlterWorld
1
我将其视为标准网站:用户登录,然后获取其租户ID并重定向到该租户的主页。尽管在URL中使用租户ID没问题,但您需要确认每个请求中的用户是否被允许访问该租户ID,而简单的方法是将tenantID保存在会话中(Session["TenantID"] = user.TenantID),这样您就不必在每个请求上查询用户配置文件了。我可能会在我的基础Controller类中放置代码来确认用户是否允许访问查询字符串中的TenantID;如果不允许,则重定向。 - D'Arcy Rittich
感谢您的回复,我会在会话中使用租户ID。 - AlterWorld

0
我想补充一下,内联表值函数在构建任何隔离层时也非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接