我创建了一个使用实体框架数据库的asp.net odata web api项目。这没什么特别的,很多教程采用这种方法。我已经使用用户和角色保护了这个API,因此只有管理员可以使用web api实际保存一些内容。
我的下一步是使某些信息仅可供特定角色使用。例如,如果我有一个具有Salary属性的实体Employee。那么我如何限制(读取)只有管理员访问此属性?
修改
我会尝试指出我的问题。 给出以下控制器:
public class EmployeeController : ApiController
{
public IQueryable<Employee> Get()
{
return _Db.Employees;
}
}
现在我能够写出odata querys,例如http://api.com/employee?$select=FirstName,LastName,Salary&$orderby=Salary
如果我不希望某些人(或角色)按薪水排序,我可以实施OrderByQueryValidator。 但是,如何让普通用户完全隐藏Salary属性,同时仍然允许管理员选择它?
所以,鉴于上面的控制器,我希望管理员能够执行这两个:
http://api.com/employee?$select=FirstName,LastName,Salary&$orderby=Salary
http://api.com/employee?$select=FirstName,LastName&$orderby=FirstName
普通用户只能执行此操作:
http://api.com/employee?$select=FirstName,LastName&$orderby=FirstName
并在尝试选择Salary属性时出错。
答案 0 :(得分:1)
使用ViewModel方法。而不是给出Employee对象,创建一个名为EmployeeViewModel的新类并创建您想要共享的属性。我还建议创建一个静态方法来从Model中创建ViewModel,反之亦然。
答案 1 :(得分:0)
创建自定义授权始终是项目的一个有趣部分。我实施它的最灵活/最干净的方式是方面。 我们使用PostSharp,我们只创建了一个RequirePermission属性,可以应用于任何方法。 该属性具有一个包含权限的参数,该权限是执行该方法所必需的。例如:RequirePermission(Permission =“ReadSalary”)。 您可以在属性中决定在用户没有所需权限时要执行的操作。抛出异常,或者只是跳过方法执行。
你可以在没有方面的情况下达到相同的行为,但是你可能会编写更多的代码,而且我觉得用方面来解决它会更加清晰。
更快更简单的方法可能是为不同的角色设置不同的ViewModel,但如果您确定将角色数量(如管理员和用户)保持在较低水平,我只建议使用类似的东西。您可以拥有EmployeeSummary和EmployeeDetails视图模型,并根据当前用户的角色简单地返回正确的模型。