【发布时间】:2015-03-07 16:29:32
【问题描述】:
我的数据库中有两个实体暴露在 ASP.NET WebApi 2 OData 中:服务Employee 和Activity。为简单起见,我们假设它们如下所示:
public class Employee {
public int Id { get; set; }
public string Type { get; set; }
}
public class Activity {
public int Id { get; set; }
public int EmployeeId { get; set; }
public virtual Employee OpenedBy { get; set; }
}
请注意,OpenedBy 属性对应于导航属性,例如我可以运行以下 OData 查询:
GET http://localhost/odata/Activities?$expand=OpenedBy
我想阻止某些员工类型在 OData 中显示。假设我无法在数据源上执行此操作,因此我必须在代码中执行此操作。
到目前为止我所做的是在EmployeesController中阻止这些类型(从EntitySetController继承):
[Queryable]
public override IQueryable<Employee> Get() {
return dbContext.Employees.Where(e => e.Type != "Restricted").AsQueryable();
}
[Queryable]
protected override Employee GetEntityByKey([FromODataUri] int key) {
var employee = dbContext.Employees.Find(key);
if (employee == null || employee.Type == "Restricted") {
throw new ODataException("Forbidden");
}
return employee;
}
这很好用。但是,我注意到如果我运行查询:
GET http://localhost/odata/Activities?$expand=OpenedBy
我没有点击员工控制器中的代码,因此受限制的员工记录是可见的。有什么好的方法可以防止这种情况发生?
【问题讨论】:
标签: c# asp.net asp.net-web-api odata