c# - EF Core 中的数据库资源授权

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

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

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

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;
    }
}

但这不会编译 I,因为我无法转换我的 Queryable返回filteredDBSet .

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

  1. 我希望我的上下文能够根据角色隐式保护数据 (这样任何使用上下文的用户都不必担心 包装他们的查询以检查授权。)
  2. 为用户提供大量额外配置

我有一个函数,它已经根据 SQL 的元数据生成我的表达式。我的问题是申请过滤到 DBSet s。

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

最佳答案

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 .

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

关于c# - EF Core 中的数据库资源授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48036547/

相关文章:

c# - 更新所有子实体,EF/Linq

c# - 在 F# 中编写此 AWS C# 代码片段

c# - 如何使用 FK 设置集合属性?

c# - Entity Framework + LINQ 缓慢与字符串查询速度?

asp.net-core - 如何使用方法在 Entity Framework Core 中的属性上添加过滤器?

c# - 是什么导致了这个 "no such table exception"?

c# - EF 核心 : Update column only for modified properties from disconnected entity

c# - 将通用列表绑定(bind)到下拉列表

c# - 按标签查找 DataGridView 项目(行)

c# - 如何在 EF 中使用一个 Insert 查询添加多行