【问题标题】:What's the best way to implement roles in a multi-tenant .net project?在多租户 .net 项目中实现角色的最佳方式是什么?
【发布时间】:2017-12-28 01:24:21
【问题描述】:

我的应用程序是带有实体框架 6 的 .NET 4.7 Web Api。

这是针对我正在构建的软件即服务工具。在我的应用程序中,AspNetUser 和 Company 之间存在多对多关系。

一个用户可以有很多公司,一个公司可以有很多用户。用户需要根据要与之合作的公司具有不同的角色/权限集。实现这样的事情的最佳方法是什么?

我曾考虑将 CompanyId 列添加到 AspNetUserRoles 表中,这样用户对于与其相关的不同公司将具有不同的角色。我不确定这是一个很好的实现,它可能会破坏授权的工作方式,所以在我更清楚地了解事情的工作原理之前,我不想碰它。

到目前为止,我已经找到了 this guide 关于多租户应用程序的基于资源的授权。这似乎是我正在寻找的,但它适用于 .NET Core,我不确定它是否适用于 .NET 4.7。

我无法为 .NET 4.7 找到类似的东西,所以我正在联系堆栈溢出社区。

【问题讨论】:

  • 考虑将您的问题范围缩小到您在选择的实现中遇到的任何问题。
  • @NoRefundsNoReturns 我没有选择的实现,我在问哪种实现最好推进。我迷失在起点。
  • 建议:重新评估您是否真的需要用户和公司是多对多的。如果您可以避免这种情况并陷入多租户的常见模式,其中每个公司(租户)拥有一个用户,并且如果一个用户需要与多个公司关联,那么他们有多个帐户,这会容易得多。如果您绝对必须允许用户在公司(租户)之间共享,那么您最好的选择是覆盖和重写大部分身份框架以支持用户和公司(公司用户实体)之间以及公司用户和公司之间的多对多关系。角色(CompanyUserRole 实体)。
  • @chambo 允许一些用户管理许多公司并让公司拥有自己的用户是我提供的一个关键部分。我将 CompanyId FK 添加到 AspNetUserRoles 表并编写了自定义 RoleProvider。这似乎可行,这样做有没有我没有看到的缺点?

标签: c# asp.net .net entity-framework asp.net-web-api


【解决方案1】:

如果您是从头开始构建它,我建议切换到 ASP.NET Core 并利用基于资源的授权。

我会建议重新考虑在租户之间共享数据库。对于 SaaS 应用程序来说,这并不是一个好主意。除非您需要节省一些钱并且您愿意增加代​​码的复杂性。你可以阅读Multi-tenant SaaS database tenancy patterns

如果你想坚持你所拥有的,我只能推荐引入与 AspNetUser 和 Company 有关系的新类 Employee。这就是您如何设法拥有对许多公司来说可能很紧张的单个用户,但另一方面,公司将只有员工的集合。

根据角色,您可以执行类似于用户-员工-公司关系的操作。由于用户角色需要由应用程序所有者(您)管理,因为您在控制器和操作上设置授权属性,所以您只允许公司管理员选择您定义到 CompanyRole 类的角色。公司可以有多个 CompanyRole 和多个 AspNetUSerRole。

例子:

您设置角色 SuperAdmin[对应用程序和数据拥有绝对控制权的人](可能是您和您的一些同事)、CompanyAdmin[对公司拥有绝对控制权的人](可能是在你的应用程序),EmployeeAdmin[授予管理公司员工访问权限的人](可能是公司人力资源部门的人),EmployeeReader[授予公司内只读员工访问权限的人](可能任何人都可以阅读有关其他员工的信息)等。取决于您的需求以及您的授权权限的粒度或您希望拥有的权限。

接下来,您让 CompanyAdmin 创建一组与他的公司紧密相关且与您的角色相关的 CompanyRole 条目。例如,CompanyRole 将是 HumanResourcesAdmin,并且与您的角色 EmployeeAdmin 有关系。

接下来,CompanyAdmin 需要创建新员工并说该员工具有这些 CompanyRoles。您需要将员工与您的帐户配对(如果不存在,他需要注册)。这可以通过创建员工后通过电子邮件发送的邀请链接或 CompanyAdmin 单击按钮邀请用户来完成。

接下来,在用户注册/登录后,您需要注意他要登录的公司,并据此轻松为他的身份添加正确的角色。

清楚吗?

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 2011-03-28
    • 2018-06-15
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多