2

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

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

我以前在使用 RoleProvider 和使用 Controller 的 Attibutes 的解决方案中工作过,但在那种情况下,我创建了所有组并在 Controller 中手动设置,例如:

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

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

那么如何获取允许用户动态访问的所有角色呢?

谢谢!

4

2 回答 2

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 教程。

更多信息:ASP.NET MVC 中基于文档的安全性

于 2009-10-06T20:35:08.670 回答
1

您是否考虑过编写自己的属性来装饰您的动作?

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

我认为您需要有一个表来指示角色可以访问哪些页面,哪些页面可以交叉引用到分配给用户的角色。

或者您可以以这样的方式编写您的属性,以便它指示允许查看页面的角色。

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

这有帮助/有意义吗?

于 2009-10-06T23:54:26.020 回答