【发布时间】:2011-01-04 19:15:55
【问题描述】:
我知道可以使用 Authorize 属性来装饰控制器以控制访问,但我不知道在区域中的所有控制器/视图中强制实施安全性的公认或正确方法。
web.config、区域注册或其他地方有什么东西可以应用授权安全吗?
【问题讨论】:
标签: asp.net-mvc security asp.net-mvc-3
我知道可以使用 Authorize 属性来装饰控制器以控制访问,但我不知道在区域中的所有控制器/视图中强制实施安全性的公认或正确方法。
web.config、区域注册或其他地方有什么东西可以应用授权安全吗?
【问题讨论】:
标签: asp.net-mvc security asp.net-mvc-3
一种方便的方法是创建一个新的基类
[Authorize]
public abstract class AuthorizeBaseController : Controller
{
}
并确保您需要授权的所有控制器(在您的情况下,是您关注的区域中的所有内容)都来自AuthorizeBaseController。
public class HomeController : AuthorizeBaseController
{
public ActionResult Index()
{
return View();
}
}
[Authorize] 属性应该影响新基类的所有后代。
编辑 我在使用<location path="" > 方法时遇到的问题是,由于路由引擎使得任何路由都可以调用任何控制器,因此基于 url 设置授权(因此一个特定的路由)而不是控制器的动作使得可以调用一个应该被保护的控制器并跳过授权。这在 web 表单中不是问题,因为页面是一个页面(而不是方法调用),但是 MVC 中页面/路径和代码之间的分离使得这成为一个巨大的安全漏洞。
【讨论】:
在 MVC 应用程序中执行此操作的唯一安全方法是按照 David 的建议进行操作 - 将基础控制器归入基础控制器,并将区域中的所有控制器作为基础控制器的子类。
在 MVC 中使用
此外,请记住,区域实际上只是分组路线的一种奇特方式,而不是控制器。尝试使用花哨的逻辑来检测当前区域并推断授权设置也会在您的应用程序中打开安全漏洞。
【讨论】:
如前所述,您可以在 web.config 中使用 <location /> 元素。否则,您可以为每个区域使用一个基本控制器类并用AuthorizeAttribute 装饰它,这样所有从它继承的控制器也会被过滤。
【讨论】:
您可以随时使用
<location path="" >
<system.web>
<authorization>
deny or allow
</authorization>
</system.web>
</location>
【讨论】: