EF Core中的Db资源授权

时间:2017-12-30 18:03:16

标签: c# entity-framework entity-framework-core asp.net-core-2.0

我正在编写Rest API Framework,我想创建一个db授权上下文。 上下文接受角色解析器并使用它来过滤默认集。基于一套规则。

在我的第一次尝试中,我想也许我可以对实体集应用默认过滤器以禁止访问某些资源

public class AuthorizationContext : DbContext
{
    protected IConstraintResolver _constraintResolver;
    public AuthorizationContext(IConstraintResolver constraintResolver)
    {
        this._constraintResolver = constraintResolver;

    }

    public override DbSet<TEntity> Set<TEntity>()
    {
        var defaultSet = base.Set<TEntity>();

        var constraints = this._constraintResolver.GetConstraintsForTypeByRole<TEntity>();

        var filteredSet = base.Set<TEntity>().AsQueryable();

        foreach (var constraint in constraints)
        {
            filteredSet = filteredSet.Where(constraint);
        }
        //how do I apply this back to the innerQueryable
        return filteredSet;
    }
}

但这不会编译我,因为我无法将Queryable转换回filteredDBSet

我在EF-Core中找到了一些关于Secure data的不同方法的文章,但使用这种方法需要的不是我想保护数据的方式。

  1. 我希望我的上下文隐含地保护基于角色的数据     (这样任何使用上下文的用户都不必担心      包装他们的查询以检查授权。)
  2. 为用户提供了许多其他配置
  3. 我有一个函数已经根据SQL的元数据生成了我的表达式。我的问题是申请过滤到DBSet s。

    假设您获得Expression<TEntity, Bool>如何保护我的上下文,以便用户只能访问或修改我已决定的数据?

1 个答案:

答案 0 :(得分:2)

Expression<TEntity, bool>听起来像是EF Core 2.0的合适人选Global Query Filter

您可以为特定实体设置它:

modelBuilder.Entity<SomeEntity>().HasQueryFilter(expression);

或基于某些标准的多个实体 - 示例为EF-Core 2.0 Filter all queries (trying to achieve soft delete)ef core 2 apply HasQueryFilter for all entity

请注意,目前全局查询过滤器有一些限制和特殊要求,如果它们需要是动态的等等DbContext派生类(EF Core: Soft delete with shadow properties and query filters)。我确信它们会随着时间的推移而得到改进,但检查当前功能是否可以满足您的需求是很好的。