我的应用程序是.NET 4.7 Web Api with Entity Framework 6.
这是一个软件作为我正在构建的服务工具。在我的应用程序中,AspNetUser和Company之间存在多对多的关系。
用户可以拥有多家公司,公司可以拥有多个用户。用户需要根据其希望使用的公司拥有不同的角色/权限集。实现这样的事情的最佳方法是什么?
我考虑过将一个CompanyId列添加到AspNetUserRoles表中,因此用户将与其相关的不同公司拥有不同的角色。我不确定这是一个非常好的实现,它可能会破坏授权的工作方式,所以我不想触摸它,直到我更清楚地了解事情是如何工作的。
到目前为止,我已经找到了this guide基于资源的多租户应用程序授权。它似乎是我正在寻找的,但它适用于.NET Core,而且我不确定它是否适用于.NET 4.7。
我还没能找到类似于.NET 4.7的东西,所以我正在接触堆栈溢出社区。
答案 0 :(得分:0)
如果从头开始构建它,我建议切换到ASP.NET Core并利用基于资源的授权。
我建议重新考虑租户之间的共享数据库。对于SaaS应用程序来说,这不是一个好主意。除非你需要节省一些钱,否则你愿意增加代码的复杂性。您可以阅读Multi-tenant SaaS database tenancy patterns。
如果你想坚持你所拥有的东西,我只能建议引入与AspNetUser和Company有关系的新班级员工。这就是为什么你设法让单个用户对许多公司来说很紧张,但另一方面,公司只有员工集合。
根据角色,您可以执行与User-Employee-Company关系类似的操作。由于用户角色需要由应用程序所有者(您)管理,因为您要在控制器和操作上设置授权属性,您只允许公司管理员选择您为CompanyRole类定义的角色。公司可以拥有许多具有许多AspNetUSerRole的CompanyRole。
示例:
您设置角色SuperAdmin [对应用和数据具有绝对控制权的人](可能是您和您的同事),CompanyAdmin [对公司有绝对控制权的人](可能是创建公司的人)您的应用程序),EmployeeAdmin [授权管理公司内部员工的人员](可能来自公司人力资源部门的人员),EmployeeReader [已授予公司内部只读员工访问权限的人员](可能任何人都可以阅读有关其他员工的信息等等。取决于您的需求以及授权权限的粒度或者您希望获得的权限。
接下来,让CompanyAdmin为您的公司创建一组与您的角色关系密切的CompanyRole条目。例如,CompanyRole将是HumanResourcesAdmin,并与您的角色EmployeeAdmin有关系。
接下来,CompanyAdmin需要创建新的员工,并说该员工拥有那些CompanyRoles。您需要将员工与您的帐户配对(如果不存在,则需要注册)。这可以通过您在创建员工后发送的电子邮件上的邀请链接或CompanyAdmin单击按钮邀请用户来完成。
接下来,在用户注册/登录后,您需要照顾他想要登录的公司并在此基础上,您可以轻松地为他的身份添加正确的角色。
是否清楚?