2015-09-09 161 views
1

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

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

角色

用户可以持有许多团体的作用。例如,该组的创建者立即成为该组的管理员。不同的角色可以访问组内的不同事物。

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

这个在真实世界中的一个简单例子就是facebook上的群组,其中包含管理员,版主,内容创建者等。只有成员可以看到它们,编辑它们或张贴给他们。

任何想法?

+0

究竟是什么问题? – user1666620

回答

1

这是一个非常主观的设计问题,可能没有单一的“正确”答案。

我倾向于将aspnet角色用于应用程序级角色,例如系统管理员和普通用户,并且与应用程序级权限有关 - 可以向应用程序添加新用户,删除记录的能力,编辑能力记录等

这听起来对我来说更像是这样的事情,你希望用户能够自己做,而无需疏忽。

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

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

+0

是的,我尽可能让团队和角色将保持不变(管理员,主持人,成员),但我想知道是否有什么我可以重写/实现,将使“如果(!IsAMember( (Group = id,Role = admin)]属性 – AllFallD0wn

+0

@ AllFallD0wn,所以你真正的问题是如何将一个属性添加到actionmethod中,该属性检查用户是否与记录相关联? – user1666620

+0

这是“什么是最好的/最干净的方式来实现这个?”我假设一个属性可能是最干净的方式,因为它避免了大量的随机调用,并返回方法顶部的方法 – AllFallD0wn

1

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

AuthorizeAttribute确实2个不同的东西:

  1. 检查是否当前用户可以访问当前控制器/动作。
  2. 执行处理程序以在未经授权时执行操作。

这些东西都可以通过继承AuthorizeAttribute进行定制。从您的问题中不清楚如果用户不属于某个组或角色应采取的行动。

在任何情况下,横切关注的最佳选择(看起来是)执行IActionFilterIAuthorizationFilter(由AuthorizeAttribute执行)。

注:微软没有实现这个功能非常好(或者至少他们倾向于在他们的营销,这是具有行为属性ActionFilterAttribute)对于我们这些使用依赖注入。如果您碰巧在应用程序中使用DI,请参阅passive attributes以获得最佳选择。看几个例子herehere