【问题标题】:Controlling the accessibility of Action methods of Controller(s) in mvc在 mvc 中控制 Controller 的 Action 方法的可访问性
【发布时间】:2013-01-28 17:09:37
【问题描述】:

我有一个 MVC 3.0 应用程序,其中包含 3 个控制器和操作方法。 该应用程序是基于登录的。一旦用户通过身份验证,他就会登陆主页,在那里他会看到 3 个菜单链接,这些链接映射到三个控制器的操作方法。用户可以点击链接或在地址栏中输入网址,并可以导航到相应的页面。

但是现在链接已经变成了基于角色的,

如果 IsProductPageAllowed=true 则只有用户可以看到 ProductPage。

如果 IsMediaPageAllowed=true 则只有用户可以看到 MediaPage。

我已经根据属性值 true/false 在主页视图中轻松处理链接的可见性。

但是如果他直接在地址栏中输入url并且值为false,则正在寻找一种正确的方法来阻止用户访问ProductPage。通过检查 true false 属性,我可以轻松地在控制器的每个操作方法上执行此操作,如果值为 false,则相应地重定向到主页。

我在想一些更好的方法来做到这一点,比如在控制器本身中。

谢谢,

M.

【问题讨论】:

  • 您是否考虑过创建自定义操作选择器?
  • 不,我从未听说过这个词,我肯定也会这么看。是动作过滤器吗?

标签: asp.net asp.net-mvc-3 c#-4.0 controller


【解决方案1】:

定义一个自定义安全过滤器,它将拦截所有请求并在处理之前对其进行授权。如果授权不成功,用户将被重定向到权限不足的错误页面。

权限将取决于特定角色是否可以调用控制器的特定操作。如果用户未登录,还将有一个基本授权将用户重定向到登录页面。

【讨论】:

    【解决方案2】:

    如果您使用的是 SimpleMembership,为什么不将Roles 分配给每个成员。这样您就可以限制对任何操作甚至整个控制器的访问。

    [Authorize(Roles="Admin")] 
    public ActionResult Contact()
    {
       ViewBag.Message = "Your contact page.";
       return View();
    }
    

    使用上面的代码,只有管理员用户才能访问该操作。如果要限制整个控制器,只需将[Authorize(Roles="Admin")] 放在控制器名称的顶部即可。

    如果您需要有关如何将角色植入数据库的帮助,请阅读Kevin's Blog here

    【讨论】:

    • 嗨,我没有使用 Membership API。布尔值是自定义的,并在用户通过身份验证后填充。所以我不能用那个。
    • @thinkmmk 好吧,这很难说,因为您没有发布任何代码。无论如何,在任何情况下,您最终都可能采用相同的方法,因为您仍在谈论基于角色的成员资格。它不必是确切的 API,但原理与您要实现的目标相同。
    • @thinkmmk 另外,我应该指出你最好使用Membership API 我建议你考虑一下,特别是如果你正在使用 MVC 应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多