Asp.net MVC - 如何在不知道这些角色的情况下获得用户角色?

时间:2009-10-06 20:13:22

标签: c# asp.net-mvc security attributes membership-provider

我正在研究这个项目,管理员用户可以创建一些用作项目角色的用户组。

因此,管理员将创建一个名为“SuperAdmin”的用户组,并在下拉列表中选择将成为该组一部分的用户。

我之前在使用RoleProvider和使用Controller的Attibutes的解决方案中工作过,但在那个场合我创建了所有组并在Controller中手动设置,如:

[Access(Roles = "SuperAdmin")]
public UserController : Controller
{
}

在上面的示例中,我知道该组名为“SuperAdmin”。但是,现在,在这个新项目中,我不知道管理员用户将创建哪些组。

那么如何才能获得允许用户动态访问的所有角色?

谢谢!

2 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您需要对“SuperAdmin”值进行软编码。

我遇到了类似的问题,因为我想验证用户是否可以访问某个资源(称之为文档),但在应用程序开发期间该资源的ID是未知的。我通过创建自己的基于表的安全性并将其核心逻辑放入我的模型(实际上是业务逻辑层)来解决它。这允许我从数据库中安全地修剪数据,并在用户请求他们无法访问的资源时重定向用户。

如果您仍想使用属性执行此操作,则可以创建自定义属性(建模ASP.NET MVC使用的属性),从数据库中查找相应的权限,并进行确定。

或者,你可以在控制器方法中做到这一点,使用类似这样的东西:

Public ActionResult EditThing(int ID)
{
    ThingRepository repository = new ThingRepository();

    If (!repository.UserHasAccess(int ID))
       Return View("NotAuthorized")
    //
    // Do stuff here
}

如果您需要有关存储库的更多信息,请参阅NerdDinner tutorial

此处有更多信息:Document-Based Security in ASP.NET MVC

答案 1 :(得分:1)

您是否考虑过编写自己的属性,以便用?装饰自己的动作?

在这种情况下,您可以使用该属性获取用户的访问权限,将其与页面访问表进行匹配,然后返回结果并允许或拒绝访问页面/操作。

我认为你需要有一个表来决定角色可以访问哪些页面,这些页面可以交叉引用用户所分配的角色。

或者你可以用这样的方式编写属性,以便它决定允许查看页面的角色。

[MyAccessAttribute(Allow="SuperUser", "Admin")]
public ActionResult MyAction()

这有帮助/有意义吗?