Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在多租户.net项目中实现角色的最佳方式是什么?_C#_Asp.net_.net_Entity Framework_Asp.net Web Api - Fatal编程技术网

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

C# 什么';在多租户.net项目中实现角色的最佳方式是什么?,c#,asp.net,.net,entity-framework,asp.net-web-api,C#,Asp.net,.net,Entity Framework,Asp.net Web Api,我的应用程序是带有实体框架6的.NET4.7WebAPI 这是一个软件作为服务工具,我正在建设。在我的应用程序中,AspNetUser和公司之间存在多对多关系 一个用户可以有许多公司,一个公司可以有许多用户。用户需要具有不同的角色/权限集,这取决于用户希望与哪个公司合作。实现这样的东西的最佳方式是什么 我曾经考虑过在AspNetUserRoles表中添加一个CompanyId列,这样一个用户就可以为与其相关的不同公司拥有不同的角色。我不确定这是否是一个很好的实现,它可能会破坏授权的工作方式,因此

我的应用程序是带有实体框架6的.NET4.7WebAPI

这是一个软件作为服务工具,我正在建设。在我的应用程序中,AspNetUser和公司之间存在多对多关系

一个用户可以有许多公司,一个公司可以有许多用户。用户需要具有不同的角色/权限集,这取决于用户希望与哪个公司合作。实现这样的东西的最佳方式是什么

我曾经考虑过在AspNetUserRoles表中添加一个CompanyId列,这样一个用户就可以为与其相关的不同公司拥有不同的角色。我不确定这是否是一个很好的实现,它可能会破坏授权的工作方式,因此在我对如何工作有了更清楚的了解之前,我不想碰它

到目前为止,我发现了多租户应用程序的基于资源的授权。这似乎是我正在寻找的,但它是针对.NETCore的,我不确定它是否适用于.NET4.7


我还没有为.NET4.7找到类似的东西,所以我正在联系StackOverflow社区

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

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

如果你想坚持你现有的,我只能推荐你介绍一个新的班级员工,他将与AspNetUser和公司建立关系。这就是您如何管理单个用户的方法,这些用户可能与许多公司关系密切,但另一方面,公司将只有员工集合

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

例如:

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

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

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

接下来,在用户注册/登录后,您需要注意他想要登录的公司,并且基于此,您可以轻松地为他的身份添加正确的角色


清楚吗?

考虑将问题的范围缩小到您选择的实现中遇到的任何问题。@NoRefundsNoReturns我没有选择的实现,我想问的是什么实现最适合向前推进。我在一开始就迷失了方向。建议:重新评估您是否真的需要用户和公司多人合作y、 如果您可以避免这种情况,并落入一种常见的多租户模式,即每个公司(租户)拥有一个用户,并且如果用户需要与多个公司关联,那么他们就拥有多个帐户,这会容易得多。如果您绝对必须允许一个用户在公司(租户)之间共享那么您最好的选择就是重写大部分身份框架,以支持用户和公司(CompanyUser实体)之间的多对多关系,然后是CompanyUser和Role(CompanyUserRole实体)之间的多对多关系。允许某些用户管理多家公司并让公司拥有自己的用户是我产品的一个关键部分。我将CompanyId FK添加到AspNetUserRoles表中,并编写了一个自定义角色提供程序。这似乎是可行的,这样做是否有缺点?