C# EF-Core中的Db资源授权

C# EF-Core中的Db资源授权,c#,entity-framework,entity-framework-core,asp.net-core-2.0,C#,Entity Framework,Entity Framework Core,Asp.net Core 2.0,我正在编写一个RESTAPI框架,我想创建一个db授权上下文。 上下文接受角色解析程序,并使用该角色解析程序筛选默认集。基于一套规则 在我的第一次尝试中,我想也许我可以对实体集应用默认过滤器来禁止访问某些资源 public class AuthorizationContext : DbContext { protected IConstraintResolver _constraintResolver; public AuthorizationContext(IConstrain

我正在编写一个RESTAPI框架,我想创建一个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;
    }
}
公共类授权上下文:DbContext
{
受保护的IConstraintResolver\u constraintResolver;
公共授权上下文(IConstraintResolver constraintResolver)
{
这是。_constraintResolver=constraintResolver;
}
公共覆盖数据库集()
{
var defaultSet=base.Set();
var constraints=this.\u constraintResolver.GetConstraintsForTypeByRole();
var filteredSet=base.Set().AsQueryable();
foreach(约束中的var约束)
{
filteredSet=filteredSet.Where(约束);
}
//如何将其应用回innerQueryable
返回过滤器设置;
}
}
但这不会编译I,因为我无法将我的
Queryable
转换回
filteredDBSet

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

  • 我希望我的上下文隐式地保护基于角色的数据 (这样,任何使用上下文的用户都不必担心 包装查询以检查授权。)
  • 为用户提供了许多附加配置
  • 我有一个函数,它已经基于SQL的元数据生成了我的表达式。我的问题是将过滤器应用到
    DBSet
    s

    假设给你一个
    表达式
    我如何保护我的上下文,以便用户只能访问或修改我决定的数据?

    表达式
    听起来是EF Core 2.0的一个很好的候选

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

    modelBuilder.Entity<SomeEntity>().HasQueryFilter(expression);
    
    modelBuilder.Entity().HasQueryFilter(表达式);
    
    或基于某些标准的多个实体-示例为和


    请注意,当前全局查询筛选器有一些限制和特殊要求,如果它们需要是动态的,则需要根到
    DbContext
    派生类()。我很确定它们会随着时间的推移而改进,但最好检查一下当前的功能是否能满足您的需要。

    EFC 2.0是指Entityframework plus中的功能吗?我以为这些不适用于ef7?不,正如你从链接中看到的,这些是EF核心的一部分。谢谢,我没看到那是一个链接!如果你发布一个答案,它们看起来会起作用。我会将它标记为正确,当我完成任何一种方式时,我会发布我的工作代码