【问题标题】:Making sure resource is owned by tenant in a multi-tenant system in ASP.NET Core在 ASP.NET Core 的多租户系统中确保资源归租户所有
【发布时间】:2017-11-25 00:31:17
【问题描述】:

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

public interface EmployeeService : IEmployeeService
{
    private IEmployeeRepository _employeeRepository;

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

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

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

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

public Employee GetById(int tenantId, int employeeId)

但我在想是否有更好的方法。我觉得 GetById 方法应该只有 1 个参数。可能是我想多了,我不确定。

我可以考虑的另一种方法是让 EmployeeService 拥有一个成员 TenantId,当它被实例化时,在调用 GetById 之前填充并使用 TenantId 来检查它是否拥有正在检索的employeeId。但我无法完成这项工作,因为 EmployeeService 是在启动期间在 ConfigureService 中创建的,并且只有在有人成功登录后我才会知道 TenantId。

【问题讨论】:

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


    【解决方案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。 我们正在使用相同的方法来管理我们项目中的多租户。实际上,这是一个完美的解决方案。

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2021-04-03
      • 2022-01-08
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多