【问题标题】:Area level security for asp.net mvcasp.net mvc 的区域级安全性
【发布时间】:2011-01-04 19:15:55
【问题描述】:

我知道可以使用 Authorize 属性来装饰控制器以控制访问,但我不知道在区域中的所有控制器/视图中强制实施安全性的公认或正确方法。

web.config、区域注册或其他地方有什么东西可以应用授权安全吗?

【问题讨论】:

    标签: asp.net-mvc security asp.net-mvc-3


    【解决方案1】:

    一种方便的方法是创建一个新的基类

    [Authorize]
    public abstract class AuthorizeBaseController :  Controller
    {
    }
    

    并确保您需要授权的所有控制器(在您的情况下,是您关注的区域中的所有内容)都来自AuthorizeBaseController

    public class HomeController : AuthorizeBaseController
    {
      public ActionResult Index()
      {
        return View();
      }
    }
    

    [Authorize] 属性应该影响新基类的所有后代。

    编辑 我在使用<location path="" > 方法时遇到的问题是,由于路由引擎使得任何路由都可以调用任何控制器,因此基于 url 设置授权(因此一个特定的路由)而不是控制器的动作使得可以调用一个应该被保护的控制器并跳过授权。这在 web 表单中不是问题,因为页面是一个页面(而不是方法调用),但是 MVC 中页面/路径和代码之间的分离使得这成为一个巨大的安全漏洞。

    【讨论】:

    • 建议您的方法作为 MVC2 的旧方法。一点也不暗示你是不正确的。这是使用全局过滤器blogs.msdn.com/b/rickandy/archive/2011/05/02/… 的 MVC3 新技术和改进技术的链接
    • 欢迎您,这是一种恭维,因为我是在周二才开始尝试学习 MVC3。 :)
    【解决方案2】:

    在 MVC 应用程序中执行此操作的唯一安全方法是按照 David 的建议进行操作 - 将基础控制器归入基础控制器,并将区域中的所有控制器作为基础控制器的子类。

    在 MVC 中使用 标签进行授权在您的应用程序中打开安全漏洞。您对保护 URL 或路由不感兴趣。您想保护控制器本身,因为它们是您要保护的实际资源。因此保护需要直接放在控制器上。

    此外,请记住,区域实际上只是分组路线的一种奇特方式,而不是控制器。尝试使用花哨的逻辑来检测当前区域并推断授权设置也会在您的应用程序中打开安全漏洞。

    【讨论】:

      【解决方案3】:

      如前所述,您可以在 web.config 中使用 <location /> 元素。否则,您可以为每个区域使用一个基本控制器类并用AuthorizeAttribute 装饰它,这样所有从它继承的控制器也会被过滤。

      【讨论】:

        【解决方案4】:

        您可以随时使用 <location path="" > <system.web> <authorization> deny or allow </authorization> </system.web> </location>

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多