C# 数据库通用资源授权
我正试图找出如何基于角色动态授权我的上下文C# 数据库通用资源授权,c#,entity-framework,authorization,.net-core,filtering,C#,Entity Framework,Authorization,.net Core,Filtering,我正试图找出如何基于角色动态授权我的上下文 public interface IConstraintResolver { Expression<Func<TEntity, bool>>[] GetConstraintsForTypeByRole<TEntity>() where TEntity : class; } public class AuthorizationContext : DbContext { protecte
public interface IConstraintResolver
{
Expression<Func<TEntity, bool>>[] GetConstraintsForTypeByRole<TEntity>()
where TEntity : class;
}
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;
}
}
公共接口IConstraintResolver
{
表达式[]GetConstraintsForTypeByRole()
其中tenty:类;
}
公共类AuthorizationContext: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
返回过滤器设置;
}
}
我的问题是,在应用我的可查询性之后,如何将其设置为集合的默认可查询性
我发现了一个与旧DbSet一起工作的gyst
但是.Net核心不包含IDBSet
如何创建自定义数据库集,或者如何筛选现有数据库集?有更好的方法,可以通过:
公共类授权上下文:DbContext
{
静态授权上下文()
{
QueryFilterManager.Filter(q=>q.Where(x=>x.Price@SlavaUtesinov)这仍然适用于保存和连接到更改跟踪器等。我觉得应该有一种简单的方法来过滤此集合。默认情况下,我需要我的上下文来过滤此集合。因此开发人员不需要记住过滤上下文。但通常情况下,这可能会起作用,再加上1确定,在这种情况下,您可以使用global filters,看看更新后的答案。谢谢,我今晚会调查这个问题。我更喜欢包含一个额外的依赖项,但如果这项工作有效,我今晚会将其标记为正确。我通常倾向于自己写东西,但这个库将为我节省大量时间,谢谢!
public class AuthorizationContext : DbContext
{
static AuthorizationContext()
{
QueryFilterManager.Filter<Orders>(q => q.Where(x => x.Price <= 5000));
}
public AuthorizationContext()
{
QueryFilterManager.InitilizeGlobalFilter(this);
}
}