C# EF-Core中的Db资源授权
我正在编写一个RESTAPI框架,我想创建一个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
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中找到了一些关于不同方法的文章,但使用这种方法需要,这不是我想要保护数据的方式
DBSet
s
假设给你一个表达式
我如何保护我的上下文,以便用户只能访问或修改我决定的数据?表达式
听起来是EF Core 2.0的一个很好的候选
您可以为特定实体设置它:
modelBuilder.Entity<SomeEntity>().HasQueryFilter(expression);
modelBuilder.Entity().HasQueryFilter(表达式);
或基于某些标准的多个实体-示例为和
请注意,当前全局查询筛选器有一些限制和特殊要求,如果它们需要是动态的,则需要根到
DbContext
派生类()。我很确定它们会随着时间的推移而改进,但最好检查一下当前的功能是否能满足您的需要。EFC 2.0是指Entityframework plus中的功能吗?我以为这些不适用于ef7?不,正如你从链接中看到的,这些是EF核心的一部分。谢谢,我没看到那是一个链接!如果你发布一个答案,它们看起来会起作用。我会将它标记为正确,当我完成任何一种方式时,我会发布我的工作代码