使用 .NET 和 IIS 的多租户 SaaS

Posted

技术标签:

【中文标题】使用 .NET 和 IIS 的多租户 SaaS【英文标题】:Multi tenant SaaS using .NET and IIS 【发布时间】:2014-01-27 12:35:52 【问题描述】:

我正在尝试创建一个多租户 SaaS 站点,并且已经阅读了很多关于该主题的主题,但仍有一些事情我不确定。

    大多数示例使用Request.Url.Host 来确定租户。问题是检查租户的最佳位置在哪里,是Controller constructor 还是global.asax?由于需要检查每个请求,我猜租户/主机映射应该存储在某个地方的哈希表中?

    IIS 和应用程序池如何适应所有这些,我是否仍需要为每个租户提供一个 IIS 站点 + 应用程序池,但将物理路径指向同一位置?还是我只需要一个站点+应用程序池?

    对于每个租户站点的身份验证,我猜我们只需要将 cookie 设置为租户域/子域?

    HttpCookie cookie = FormsAuthentication.GetAuthCookie(username, true); cookie.Domain = "subdomain.domain.com"

    您将如何为特定租户缓存数据? HttpRuntime.Cache["CacheData"]不是每个租户都可以使用这个缓存吗?

【问题讨论】:

4.我们在谈论什么数据? @Alexander 一个带有文件依赖缓存的模板文件(主要是 html 【参考方案1】:

这里只是关于这一切的一些想法:

    Request.Url.Host 没问题。您可以使用 Global.asax 或自己的(抽象)基本控制器(我总是称之为ControllerBase)。我不建议您在您编写的每个控制器中使用它 - 尝试将所有必要的内容放在某种配置类中并将其加载到应用程序启动或 BaseController 中的按需 - 您可以更改此类基础的构造函数类来获取租户的标识符。

    您可以同时执行这两种操作 - 如果您只是将绑定添加到单个站点和应用程序池,这可能是最简单的。

    这是一种方法,但您也可以执行某种基于声明的身份验证,其中包含目标租户

    您可以创建依赖于租户的缓存(因为您可以定义依赖于登录用户的缓存。

【讨论】:

对于第 2 点,将其作为单个应用程序池执行是否有任何优点/缺点?对于基于声明的身份验证,WIF 之类的工作是否可行? WIF 应该可以工作并且不关心(2)。如果您具有数据库级访问权限并为 db 服务器使用 Windows 身份验证,则可能需要多个 AppPool。其他资源也一样。【参考方案2】:
    我宁愿写一个自定义的HTTP Module。 最好使用一个应用程序池,因为您不想为每个新客户都进行配置。 是的。 是的。

【讨论】:

与使用基本控制器相比,使用自定义 HTTP 模块有什么优势吗?

以上是关于使用 .NET 和 IIS 的多租户 SaaS的主要内容,如果未能解决你的问题,请参考以下文章

多租户和多应用怎么对应

什么是多租户saas架构设计

SAAS 架构模式下的多租户系统设计

SAAS 架构模式下的多租户系统设计

云平台下的多租户架构,从SaaS应用到PaaS平台,你应该理解的一些关键点

云平台下的多租户架构,从SaaS应用到PaaS平台,你应该理解的一些关键点