【问题标题】:ASP.NET Web API role based security基于 ASP.NET Web API 角色的安全性
【发布时间】:2014-05-14 15:27:05
【问题描述】:

我创建了一个使用实体框架数据库的 asp.net odata web api 项目。这没什么特别的,很多教程都采用这种方法。我已经用用户和角色保护了这个 api,所以只有管理员才能真正使用 web api 保存一些东西。

我的下一步是让某些信息只有特定角色才能访问。例如,如果我将拥有一个具有 Salary 属性的实体 Employee。那么我将如何将对该属性的访问限制(读取)仅限于管理员?

编辑

我会尝试具体说明我的问题。 给定以下控制器:

public class EmployeeController : ApiController
{
    public IQueryable<Employee> Get()
    {
        return _Db.Employees;
    }
}

现在我可以编写 odata 查询,例如 http://api.com/employee?$select=FirstName,LastName,Salary&amp;$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 属性时出错。

【问题讨论】:

  • 这就是你得到setter和getter的目的。
  • 如果我在这种情况下使用 getter,我仍然必须返回一个默认值(或 null)。然后在我的 json 或 xml 响应中,我得到具有默认值的属性。这对我来说似乎不对。

标签: c# asp.net security asp.net-web-api


【解决方案1】:

使用 ViewModel 方法。与其提供 Employee 对象,不如创建一个名为 EmployeeViewModel 的新类并创建您想要共享的属性。我建议还创建一个静态方法来从模型创建一个 ViewModel,反之亦然。

【讨论】:

  • 尽管@dave 在他的回答中提到了限制,但我喜欢 ViewModels 的方法。但是,我不确定这适合哪里。我的控制器返回通用 IQueryable,然后返回我的一些实体框架类。通过这种方式,我能够利用 OData 的优势,例如 $select 和 $expand。所以使用 ViewModel 可能意味着我必须自己实现很多 OData 东西?
【解决方案2】:

创建自定义授权始终是项目的一个有趣部分。我实现它的最灵活/最干净的方式是方面。 我们使用了PostSharp,并且我们简单地创建了一个RequirePermission 属性,它可以应用于任何方法。 该属性有一个参数,其中包含执行该方法所需的权限。例如:RequirePermission(Permission="ReadSalary")。 您可以在属性中决定当用户没有所需权限时要做什么。要么抛出异常,要么直接跳过方法执行。

你可以在没有切面的情况下达到相同的行为,但你可能会写更多的代码,而且我发现用切面来解决它更干净。

一种更快更简单的方法可能是为不同的角色使用不同的 ViewModel,但我只建议您在确保将角色(如管理员和用户)的数量保持在较低水平的情况下使用类似的方法。您可以拥有一个 EmployeeSummary 和一个 EmployeeDetails 视图模型,然后根据当前用户的角色简单地返回正确的视图模型。

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2011-05-12
    • 1970-01-01
    • 2011-11-03
    • 2010-12-28
    • 2019-03-13
    相关资源
    最近更新 更多