使用Entity Framework管理实体访问和权限

在使用Entity Framework 4.1的Web应用程序中,我们使用SQL Server Membership来管理用户访问。 但是,我们需要在权限管理中实现更细粒度的角色集。

在数据库中,我们已经创建了相关表:

- Roles - Permissions - UserInRole (roles per user) - RolesPermissions (permissions associated to a role) 

使用某些核心实体上的属性,我们使用EF限制语义访问,例如,给定特定用户,他/她只能看到相对发货的订单或固有数据。

现在我们想在其中注入权限,这意味着客户可以查看和创建订单,而公司 (这是两个不同的角色)只能查看其产品的订单并打印报告。

我们的想法是在实体级别也使用属性,并在调用方法时检查当前用户是否拥有适当的权限。 例如:

 public void BeforeAdd() { // Get required permissions for the specific entity (Order as example) //Check that current user has permission of creating a new Order } 

这种方法将由每个实体调用,允许集中控制实体级别的权限。

我们使用MVC作为前端,在那里我们已经实现了角色和权限访问。 我们需要对后端部分(包含数据层)进行相同的操作。 这是通过Web服务进行通信的两个独立服务器。 通过在后端部分实施权限管理将加强对数据访问的控制。

我们可以遵循任何模式或最佳实践(最终使用EF的一些内置function)来实现权限管理吗?

我们可以遵循任何模式或最佳实践吗?

是的,它被称为面向方面编程 , PostSharp可能是这项工作的最佳工具(不幸的是它不是免费的)。

但是,如果您正在使用MVC(您尚未提及此类内容),您可以派生自己的AuthorizeAttribute版本来查询您自己的权限表,并且您可以使用您想要允许的角色简单地修饰您的操作,例如

 [Authorize(Roles="Customer, Company")] public ActionResult ViewOrders(...) { ... } [Authorize(Roles="Customer")] public ActionResult CreateOrder(...) { ... } 

您熟悉ASP.NET的默认成员资格提供程序吗?

这是如何设置会员制的典型示例。 如果您不熟悉它,可能是一个很好的例子。

您可能还会发现此SO问题很有帮助。