MVC:创建一个带参数的自定义[AuthorizeAttribute]?

时间:2011-01-13 15:04:03

标签: asp.net-mvc attributes authorization

这是我的问题:

我正在授权用户完成他们的角色,一部分。

 [Authorize(Roles = "Admin,...")]
 public class ModulesController : Controller {
    .....
 }

模块控制器显示用户有权使用的模块列表。 (有很多模块,但用户只连接到其中的一部分)。有很多东西与模块耦合,比如问题,......

例如:Modules控制器的详细信息视图。

    public ActionResult Details(int id) {
        var mod = (from p in _db.Modules
                   where p.Mod_ID == id
                   select p).First();

        return accessible(mod);
    }

    [NonAction]
    public ActionResult accessible(Module p) {
        if (MvcApplication.accessible(HttpContext.User, p.Mod_ID)) {
            return View(p);
        }
        ViewData["delError"] = "Not Accessible";
        return View("Error");
    }

使用此代码,我检查此用户是否已连接到他请求查看其详细信息的指定模块。

我不喜欢这种方法,因为我并不总是在视图中返回Module所以这里有很多重载方法,对于模块的子页面,比如问题,我也是需要检查该人是否正在查看他有权访问的模块的问题。

我想使用authorize属性执行此操作,该属性将从模块中获取ID,并且可以授予或拒绝对该特定模块的访问权限。我的问题是,当用户请求查看问题时,我需要用一些代码找出模块ID。有时,moduleID在url中,但情况并非总是如此。

我该怎么做?尝试使用属性会不会很好?或者我需要以不同的方式做到这一点吗?

修改:

我正在尝试在答案中提出建议,但我如何在控制器构造函数中获取routedata(如ID)?

1 个答案:

答案 0 :(得分:2)

请参阅:Asp.net mvc authorize attribute integrated with a parameter

真的很沮丧,相关的搜索没有拿起这些东西......