具有租户特定角色的 ASP.NET 多租户应用程序

Ted*_*ott 2 c# asp.net asp.net-membership roleprovider asp.net-mvc-3

我们有一个多租户 ASP.NET 应用程序。到目前为止,租户已相互隔离,但是现在我们拥有管理多个租户的代理,并希望能够使用单个用户帐户管理所有租户。我正在努力找出实现这一目标的最佳方法,希望不会对我们正在使用的现有技术进行太大改变。

相关技术细节:

  • 用于成员资格和角色的 AspNetSqlMembershipProvider
  • C# 4.0(即将成为 4.5)
  • 表单认证
  • aspx 和 MVC (v3) 页面
  • 假设有 100 个或更多租户,因此任何解决方案都需要支持

我相信这些要求与 SQL Server 的安全模型非常相似。我们有一组登录名,代表可以登录系统的所有用户。用户应该能够被赋予一个或多个数据库(租户)的角色。示例:用户 Bob 在公司 A 中具有管理员角色,但在公司 B 中仅具有用户角色。我们还为我公司的员工提供“系统管理员”角色,允许我们访问任何租户以及专门的管理权限,例如创建/删除租户, 等等。

我对各种库、框架等进行了大量研究,但没有发现任何令人信服的证据表明其他库或框架会比我们目前拥有的更好。所以我目前正在考虑如何让 Sql Membership 提供者做我想做的事,除非有人能指出我更好的方向。我也不确定我知道在这方面搜索的最佳术语。

我有两个我正在考虑的选择:

  1. 仅向成员资格提供者添加少数角色,并在成员资格提供者之外处理“当前用户在此租户中是否具有此角色”的所有问题。会员提供程序将用于处理对系统的基本访问。
  2. 将租户特定角色添加到成员资格提供商。我们将在系统中拥有(# 个角色)x(# 个租户)角色。每个新租户都会向系统添加另一组角色,例如“租户 A:管理员”、“租户 A:用户”等。需要一些额外的表来管理关系以及一些自定义代码以确保访问正在向成员资格提供商请求正确的租户特定角色。

这些选项中的任何一个都好吗?还是我应该到别处寻求支持?

dan*_*wig 5

我认为您无法将多租户强加到任何开箱即用的角色提供程序中,因此您不妨继续使用 SqlMembershipProvider(和 SqlRoleProvider)。即使是最新的 Microsoft.AspNet.Identity 仍然假设用户和角色之间是普通的多对多。您真正需要的是向该多对多表的主键添加第三列,这将标识您的租户,即:

user: 6
role: 4
tenant: 17

user: 6
role: 9
tenant: 18 (and so on)
Run Code Online (Sandbox Code Playgroud)

...有了这个,您可以让用户对不同的租户具有不同的权限,所有用户都使用相同的角色名称集。

如果您使用选项 #2,那么您的 [Authorize] 属性会爆炸。想象一下:

[Authorize(Roles = "TenantA:Admin", "TenantB:Admin", ...)]
public ActionResult Post(int id, SomeViewModel model) {}
Run Code Online (Sandbox Code Playgroud)

...所有这些属性都必须在编译时编写,除非您使用自定义 AuthorizeAttribute,您可以这样做。但即便如此,每次向系统添加租户时,您仍会创建一组新的角色,这应该是不必要的。