在 ASP.NET Core WebApi 中处理多个租户
Posted
技术标签:
【中文标题】在 ASP.NET Core WebApi 中处理多个租户【英文标题】:Handling multiple tenants in ASP.NET Core WebApi 【发布时间】:2022-01-08 16:41:21 【问题描述】:我开发了 .NET Core Web Api 应用程序,并且有几个不同的客户使用具有不同配置的同一个应用程序。 (应用程序加载一个配置 json 文件,监听几个端口,连接到数据库。) 现在,我为每个客户使用不同的服务器来保持他们分开。(Linode 1 Cpu,1 GB Ram)。我很难发布更新、停止启动服务等。
其他开发者如何做这样的事情?有什么方法可以合并服务器并通过单一操作进行管理?或者这样做的正确方法是什么?
【问题讨论】:
它是带有数据库连接的基本 Web api。额外的一个是服务器为每个客户端侦听 2 个额外的端口。 (每个端口不同)。 你问的叫多租户。这不是微不足道的——你不仅有不同的配置,还有不同的数据、权限、帐户。您需要防止一个租户读取另一个租户的数据。 ASP.NET Core 文档提到了一些主要围绕 Azure AD 进行身份验证的技术。 Gunnar Peipman 的Multitenant web applications with ASP.NET Core 从高层次上描述了多租户 ASP.NET Core 应用程序,随附的 Github Repo 包含演示代码 有 很多 篇关于此的文章和博客文章,但没有一个最佳选择。例如,您可以通过 URL 参数、标头或通过首先验证调用者并检查他们的帐户/声明来识别租户。如果。如果您使用 Azure AD 或类似的身份验证服务,该服务可以在 JWT 令牌中包含租户 ID。要隔离数据库访问,您可以使用 EF Core 的全局查询过滤器来确保每个租户都能看到自己的数据。但是,您如何存储是另一回事-存储在不同的数据库中?同一个数据库中的不同表?具有 TenantID 的同一张表? ASP.NET Core 配置可以从 JSON、数据库、外部服务加载设置。租户 ID 可以成为设置键的一部分,例如部分。加载所有设置后(同样,有很多选项),您可以使用特定于租户的部分读取单个租户的配置 如果您搜索 docs.microsoft.com,您会找到几篇文章。几乎每个中间件都受到它的影响并以某种方式对其进行描述。例如,DI 文档包含关于Patterns for multi-tenancy in DI 的部分,例如about data protection in multitenant apps 【参考方案1】:有一个简单的解决方案来处理这种情况。
将您的 web api 托管在单个服务器上,并在您的 web api 中使用CustomerName
或CustomerCode
参数,根据CustomerName
或CustomerCode
参数将客户的 api 路由到使用 switch case 的适当方法。
【讨论】:
这对于演示应用程序也不起作用。如果添加了另一个客户怎么办?您是否修改和重新部署整个站点,扰乱其他所有人?向 URL 添加租户 ID 甚至不是问题的 1% - 实际问题是为租户处理不同的帐户、权限、配置和数据。以上是关于在 ASP.NET Core WebApi 中处理多个租户的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS
在 ASP.Net Core 5 WebAPI 中启用 CORS