【问题标题】:MVC: creating a custom [AuthorizeAttribute] which takes parameters?MVC:创建一个带有参数的自定义 [AuthorizeAttribute]?
【发布时间】:2011-01-14 00:02:35
【问题描述】:

这是我的问题:

我正在授权用户使用他们的角色,其中一部分。

 [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,所以这有很多重载方法,对于模块的子页面,比如问题,我还需要检查此人是否正在查看他有权访问的模块的问题。

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

我该怎么做?尝试使用该属性会很好吗?还是我需要以不同的方式执行此操作?

编辑:

我正在尝试答案中的建议,但是如何在控制器构造函数中获取路由数据(如 ID)?

【问题讨论】:

    标签: asp.net-mvc attributes authorization


    【解决方案1】:

    见:Asp.net mvc authorize attribute integrated with a parameter

    真的很郁闷,相关搜索没有找到这些东西......

    【讨论】:

    • 我已经阅读了,我认为这就是我需要的。但现在在我的操作中获取单个模块的 ID,而不是在控制器中。如果我做对了,我需要在每个使用这个属性的控制器中创建一个构造函数,然后返回模块的 ID。
    猜你喜欢
    • 2011-08-20
    • 2012-03-17
    • 2014-12-23
    • 1970-01-01
    • 2019-01-05
    • 2015-10-06
    相关资源
    最近更新 更多