asp.net mvc的区域级安全性

时间:2011-01-04 19:15:56

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

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

web.config,区域注册或其他某些地方是否存在应用授权安全性的内容?

4 个答案:

答案 0 :(得分:9)

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

[Authorize]
public abstract class AuthorizeBaseController :  Controller
{
}

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

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

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

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

答案 1 :(得分:7)

在MVC应用程序中执行此操作的唯一安全方法是执行David建议的操作 - 归因于基本控制器并将所有控制器放在基本控制器的区域子类中。

使用&lt; location&gt; MVC中的授权标记在您的应用程序中打开安全漏洞。您对保护URL或路由不感兴趣。您希望保护控制器本身,因为它们是您尝试保护的实际资源。因此,保护​​需要直接放在控制器上。

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

答案 2 :(得分:0)

正如已经建议的那样,您可以使用web.config中的<location />元素。否则,您可以使用每个区域的基本控制器类并使用AuthorizeAttribute对其进行修饰,以便从中继承所有控制器的过滤器。

答案 3 :(得分:-3)

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