【问题标题】:Manage entity access and permissions with Entity Framework使用 Entity Framework 管理实体访问和权限
【发布时间】:2012-10-23 15:02:31
【问题描述】:

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

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

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

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

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

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

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 的一些内置功能)来实现权限管理?

【问题讨论】:

  • 你在使用repositories吗?
  • 是的,我们使用通过泛型允许获取每个特定实体的存储库的存储库。

标签: c# sql-server-2008 entity-framework permissions


【解决方案1】:

是否有我们可以遵循的模式或最佳实践

是的,它叫做Aspect-Oriented ProgrammingPostSharp 可能是这项工作的最佳工具(不幸的是它不是免费的)。

但是,如果您使用的是 MVC(您还没有提到任何类似的东西),您可以派生自己的 AuthorizeAttribute 版本来查询您自己的权限表,并且您可以简单地使用您想要的角色来装饰您的操作允许例如

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

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

【讨论】:

  • 我不深入了解 AOP,但我会阅读它(提示 +1)。 PostSharp 对于我们的情况来说可能太多了,因为我们已经实现了我们的日志记录和审计系统。
  • @Luca 是的,我不是建议你使用 PostSharp,只是指出它已经有一个框架可以开箱即用地处理这类事情。但是,使用 MVC,AOP 实际上可以很简单。
【解决方案2】:

你熟悉ASP.NET's default membership provider吗?

这是一个如何建立会员制度的典型例子。如果你不熟悉它可能是一个很好的学习例子。

您可能还会发现this SO question 很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2021-02-28
    • 1970-01-01
    • 2012-02-07
    • 2012-02-17
    • 2013-07-21
    • 2016-09-13
    • 2020-02-25
    相关资源
    最近更新 更多