Ted*_*ott 2 c# asp.net asp.net-membership roleprovider asp.net-mvc-3
我们有一个多租户 ASP.NET 应用程序。到目前为止,租户已相互隔离,但是现在我们拥有管理多个租户的代理,并希望能够使用单个用户帐户管理所有租户。我正在努力找出实现这一目标的最佳方法,希望不会对我们正在使用的现有技术进行太大改变。
相关技术细节:
我相信这些要求与 SQL Server 的安全模型非常相似。我们有一组登录名,代表可以登录系统的所有用户。用户应该能够被赋予一个或多个数据库(租户)的角色。示例:用户 Bob 在公司 A 中具有管理员角色,但在公司 B 中仅具有用户角色。我们还为我公司的员工提供“系统管理员”角色,允许我们访问任何租户以及专门的管理权限,例如创建/删除租户, 等等。
我对各种库、框架等进行了大量研究,但没有发现任何令人信服的证据表明其他库或框架会比我们目前拥有的更好。所以我目前正在考虑如何让 Sql Membership 提供者做我想做的事,除非有人能指出我更好的方向。我也不确定我知道在这方面搜索的最佳术语。
我有两个我正在考虑的选择:
这些选项中的任何一个都好吗?还是我应该到别处寻求支持?
我认为您无法将多租户强加到任何开箱即用的角色提供程序中,因此您不妨继续使用 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,您可以这样做。但即便如此,每次向系统添加租户时,您仍会创建一组新的角色,这应该是不必要的。
归档时间: |
|
查看次数: |
7426 次 |
最近记录: |