MVC自定义组用于授权

时间:2015-09-09 14:33:35

标签: c# .net asp.net-mvc authentication model-view-controller

我已经做了一些搜索,但它看起来不是一个非常常见或回答的问题。我需要在我正在开发的MVC应用程序中实现自定义组授权策略。它遵循“经典”的例子:

用户可以创建一个组。组作为数据库中的对象存在,具有Id,Name,以及属于该组的用户列表。

角色

用户可以在多个组中担任角色。例如,该组的创建者立即成为该组的管理员。不同的角色可以访问组内的不同内容。

我知道使用预定义组很容易,但是当我想让组动态化并且每个组都是数据库中的对象时呢?

现实世界中的一个简单例子是Facebook上的群组,其中包含管理员,版主,内容创作者等。只有会员才能看到,编辑或发帖给他们。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一个非常主观的设计问题,可能没有单一的"对"答案。

我倾向于将aspnet Roles用于应用程序级角色,例如Sysadmins和普通用户,并且与应用程序级权限有关 - 能够向应用程序添加新用户,删除记录的能力,编辑记录的能力等等。

在我看来,这更像是你希望用户能够在没有疏忽的情况下自己做的事情。

创建一个Groups表,并与Users表有多对多的关系,该表定义了用户所属的组。

如果您只想要每个组1个管理员,则可以使Group表具有AdminUserId列。否则有一个多对多关系表,GroupAdmins(我选择此选项,因为它允许扩展)。

答案 1 :(得分:1)

您可以继承AuthorizeAttribute来创建您喜欢的任何安全方案。但既然你说这不是授权,我不确定这是不是正确的做法。

AuthorizeAttribute做了两件不同的事情:

  1. 检查当前用户是否可以访问当前控制器/操作。
  2. 执行处理程序以在未经授权时执行操作。
  3. 这两件事都可以通过继承AuthorizeAttribute来定制。从您的问题中不清楚如果用户不属于组或角色,应该采取什么行动。

    在任何情况下,跨领域问题(这似乎是)的最佳选择是实施IActionFilterIAuthorizationFilter(由AuthorizeAttribute实施)。< / p>

      

    注意:Microsoft没有很好地实现此功能(或者至少他们倾向于在他们的营销中使用ActionFilterAttribute,这些属性具有行为),对于我们这些使用依赖注入的人来说。如果您恰好在应用程序中使用DI,请参阅passive attributes以获取最佳选项。请参阅几个示例herehere