在多租户的 .net 项目中,实现角色的最佳方式是什么?

3
我的应用程序是基于.NET 4.7 Web Api和Entity Framework 6构建的。这是我正在开发的一款软件即服务工具。在我的应用程序中,AspNetUser和Company之间存在多对多的关系。一个用户可以拥有多个公司,而一个公司也可以有多个用户。根据用户想要使用的公司不同,用户需要拥有不同的角色/权限集。如何实现这样的功能是最佳方式?
我考虑在AspNetUserRoles表中添加CompanyId列,这样用户就可以针对其相关公司拥有不同的角色。但我不确定这是否是一个非常好的实现方式,因为它可能会破坏授权的工作方式,所以在我更清楚了解事情的工作原理之前,我不想去尝试。
到目前为止,我已经找到了关于多租户应用程序资源授权的指南(this guide),这似乎是我正在寻找的,但它是为.NET Core编写的,我不确定它是否适用于.NET 4.7。
我还没有找到类似于.NET 4.7的东西,所以我向Stack Overflow社区求助。

请考虑将您的问题范围缩小到您选择的实现中遇到的任何问题。 - No Refunds No Returns
@NoRefundsNoReturns 我没有选择的实现,我想问一下哪种实现方式最好以继续前进。我在起点处迷失了方向。 - Suren
建议:重新评估您是否真的需要将用户和公司设置为多对多关系。如果可以避免,那么这会更容易,并且符合每个公司(租户)拥有一个用户的常见多租户模式,如果一个用户需要与多个公司关联,则他们需要多个帐户。如果您绝对必须允许用户在公司(租户)之间共享,则最好覆盖并重写大部分身份框架以支持用户和公司(CompanyUser实体)之间以及CompanyUser和角色(CompanyUserRole实体)之间的多对多关系。 - chambo
@chambo 允许一些用户管理多个公司,并且让公司拥有自己的用户是我提供的关键部分。我在AspNetUserRoles表中添加了CompanyId FK并编写了自定义RoleProvider。这似乎有效,但我是否忽略了某些缺点? - Suren
@Suren - 除了必须自己维护和升级代码之外,没有任何真正的缺点。 - chambo
1个回答

2
如果您从头开始构建,我建议切换到ASP.NET Core并利用基于资源的授权。
我建议重新考虑在租户之间共享数据库。对于SaaS应用程序来说,这不是一个好主意。除非您想节省一些钱并愿意增加代码的复杂性。您可以阅读多租户SaaS数据库租赁模式
如果您想坚持现有的方式,我只能建议引入新的Employee类,该类将与AspNetUser和Company建立关系。这就是如何管理单个用户与许多公司紧密联系的方法,但另一方面,Company将仅拥有Employees集合。
根据角色,您可以执行类似于User-Employee-Company关系的操作。由于用户角色需要由应用程序所有者(即您)管理,因为您正在设置授权属性以控制器和操作,因此您只允许公司管理员选择您定义给CompanyRole类的角色。Company可以具有许多CompanyRole和许多AspNetUSerRole。
例如:
您设置了以下角色:SuperAdmin(拥有对应用程序和数据的绝对控制权,可能是您和一些同事)、CompanyAdmin(拥有对公司的绝对控制权,可能是在您的应用程序中创建公司的人)、EmployeeAdmin(被授权在公司内管理员工的访问权限,可能是来自公司的人力资源部门)、EmployeeReader(被授权只读访问公司内员工的访问权限,可能是任何人都可以阅读其他员工的信息)等。这取决于您的需求以及您希望拥有多么精细的授权权限。
接下来,您让CompanyAdmin创建与其公司紧密相关联的CompanyRole条目集,并与您的角色建立关系。例如,CompanyRole将是HumanResourcesAdmin,并与您的角色EmployeeAdmin建立关系。
接下来,CompanyAdmin需要创建新的员工并指定该员工具有这些CompanyRoles。您需要将员工与您的账户配对(如果不存在,则需要注册)。这可以通过电子邮件发送邀请链接来完成,员工创建后或CompanyAdmin点击“邀请用户”按钮即可进行。
接下来,在用户注册/登录后,您需要考虑他想要登录哪个公司,并根据它,您可以轻松地将正确的角色添加到他的身份中。
清楚吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接