确保资源由ASP.NET Core中的多租户系统中的租户拥有

时间:2017-11-24 06:16:13

标签: c# asp.net-core multi-tenant

我正在尝试创建一个多租户系统,到目前为止,在保存方面一切正常。但早些时候,我偶然发现了一个问题,我有这项服务:

public interface EmployeeService : IEmployeeService
{
    private IEmployeeRepository _employeeRepository;

    public EmployeeService(IEmployeeRepository employeeRepository)
    {
        _employeeRepository= employeeRepository;
    }

    public Employee GetById(int employeeId)
    {
        return _employeeRepository.GetById(employeeId);
    }
}

因此,从MVC Controller调用此服务以检索具有Id的员工。问题是我希望能够检查在呼叫期间传递的employeeId是否由正在调用它的租户拥有,否则他可以在其中放入任何Id并检索任何人。

我能想到的最简单的解决方案是更改签名以包含tenantId:

public Employee GetById(int tenantId, int employeeId)

但我在想是否有更好的方法。我觉得GetById方法应该只有1个参数。也许我在思考它,我不确定。

我可以想到的另一种方式是,如果EmployeeService有一个成员TenantId,在实例化时,TenantId会在调用GetById之前填充并使用,以检查它是否拥有正在检索的employeeId。但我无法做到这一点,因为EmployeeService是在ConfigureService的Startup期间创建的,只有在有人成功登录后我才会知道TenantId。

1 个答案:

答案 0 :(得分:1)

您应该动态地在DBContext中过滤tenantId。这里有一个有用的帖子。

https://blogs.msdn.microsoft.com/mvpawardprogram/2016/02/09/row-level-security-in-entityframework-6-ef6/

您可以创建一个类似ITenantEntity的界面,它可以实现给其他拥有TenantId的实体。

public interface ITenantEntity
{
    public int TenantId { get; set; }
}

在DbContext级别,您可以使用ITenantFilter确定具有租约的实体,并且可以动态过滤它们。

此外,您不应手动将TenantId过滤器传递给方法,因为它很难管理。您可以将TenantId存储为 ClaimsPrincipal 。您应该在用户身份验证后设置TenantId,并且可以动态地从每个请求获取TenantId作为声明。 我们使用相同的方法来管理项目中的多租户。实际上,这是一个完美的解决方案。