我正在研究这个项目,管理员用户可以创建一些用作项目角色的用户组。
因此,管理员将创建一个名为“SuperAdmin”的用户组,并在下拉列表中选择将成为该组一部分的用户。
我之前在使用RoleProvider和使用Controller的Attibutes的解决方案中工作过,但在那个场合我创建了所有组并在Controller中手动设置,如:
[Access(Roles = "SuperAdmin")]
public UserController : Controller
{
}
在上面的示例中,我知道该组名为“SuperAdmin”。但是,现在,在这个新项目中,我不知道管理员用户将创建哪些组。
那么如何才能获得允许用户动态访问的所有角色?
谢谢!
答案 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。
答案 1 :(得分:1)
您是否考虑过编写自己的属性,以便用?装饰自己的动作?
在这种情况下,您可以使用该属性获取用户的访问权限,将其与页面访问表进行匹配,然后返回结果并允许或拒绝访问页面/操作。
我认为你需要有一个表来决定角色可以访问哪些页面,这些页面可以交叉引用用户所分配的角色。
或者你可以用这样的方式编写属性,以便它决定允许查看页面的角色。
[MyAccessAttribute(Allow="SuperUser", "Admin")]
public ActionResult MyAction()
这有帮助/有意义吗?