【问题标题】:Multi-Tenant physical isolation多租户物理隔离
【发布时间】:2015-07-23 00:40:18
【问题描述】:

我们有一个多租户 Asp.Net MVC 4 Web 应用程序,每个租户都有自己的文件存储库(文件系统中的一个文件夹)。我们采用共享数据库、共享模式的方法,并通过子域识别租户。

确保租户只能访问他的存储库文件夹而不能访问文件系统中的其他文件夹的最佳方法是什么?我们在应用程序的业务逻辑中检查它,但是如果我们犯了错误怎么办......?

在运行应用程序时,所有租户都在同一用户下运行(在 IIS 应用程序池中定义)。

我们是否需要将每个租户作为单独的用户提供服务 - 使用模拟?每次向服务器发出请求时,我们是否需要模拟 - 为了填充它?

我听说这有性能缺陷,不是首选方式,但什么是?

我们还有一个 Windows 服务,它在后台(针对所有租户)填充请求,并通过 MSMQ 发送给它。该服务是否也需要在每次收到请求时更改其身份?

编辑: 此外,我们需要一种隔离类型,如果有人上传了感染病毒的文件 - 它只会影响该租户的文件,而不是服务器上的每个租户。我们使用杀毒软件,但我们也需要这种分离,以防杀毒软件无法识别病毒。

谢谢

【问题讨论】:

    标签: c# asp.net-mvc iis-7.5 impersonation multi-tenant


    【解决方案1】:

    所有租户在同一个用户下运行

    如果每个租户都有单独的 IIS Web 应用程序和身份(无论是应用程序池还是“普通”用户),那么您可以使用 NTFS 访问控制。

    这些并不依赖于让所有用户在网络服务器上拥有本地或域用户帐户以允许模拟(以及此 NTFS 访问控制)。

    不过,这当然会增加服务器的内存开销——每个租户都有自己的工作进程。

    […]MSMQ。该服务是否也需要在每次收到请求时更改其身份?

    我不确定您是否可以根据 MSMQ 消息进行模拟,我希望这不起作用(MSMQ 消息不携带必要的身份信息)。

    需要实现任何共享来检查所有访问:根据处理的性质,这可能会更加困难(例如,如果客户端请求可能是“从文件中获取信息”的顺序任意文件:服务需要进行访问检查1)。


    1 Win32 函数可以完成繁重的工作。

    【讨论】:

    • 谢谢理查德。我们不想为每个租户创建不同的网站和应用程序池,因为我们需要将我们的应用程序部署到服务器上的多个网站,每个租户一个。你认为模仿不是一种选择吗?谢谢
    • @Yaron Windows 和 IIS 将在一台服务器上处理大量独立的应用程序池(我们的生产服务器上有超过 30 个 ISTR)。如果可能的话,我当然会走那条路(有开销,但不一定太多:只有你可以测试你的情况)。
    • @Yaron 从 Win2k 开始我就不需要设置模拟了,但如果适用的话,肯定需要在 AD 和站点配置中工作。并且仅限于使用 Windows 身份验证。
    • 嗨@Richard,在您建议的配置中-我可以为每个租户创建一个应用程序池+身份但使用同一个网站吗?或者我是否需要将我的 Web 应用程序部署到 IIS 中的 X 个网站,每个租户一个?也许我可以部署到一个位置并在 IIS 中创建多个指向包含 Web 应用程序文件的同一文件夹的网站?你怎么看?再次感谢!
    • @Yaron 是的,你可以。创建两个具有相同物理目录但使用不同应用程序池的网站(或 Web 应用程序)。只需记住配置等是共享的:您需要代码(使用 IIS API 来确定应用程序池,或间接地从 URL)来更改行为。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多