我知道可以使用Authorize属性来装饰控制器来控制访问,我不知道的是在区域中的所有控制器/视图中强制实施安全性的可接受或正确方法。
web.config,区域注册或其他一些地方是否存在应用授权安全性的内容?
我知道可以使用Authorize属性来装饰控制器来控制访问,我不知道的是在区域中的所有控制器/视图中强制实施安全性的可接受或正确方法。
web.config,区域注册或其他一些地方是否存在应用授权安全性的内容?
一种方便的方法是创建一个新的基类
[Authorize]
public abstract class AuthorizeBaseController : Controller
{
}
并确保您需要授权的所有控制器(在您的情况下,您所关注的区域中的所有内容)都来自 AuthorizeBaseController
。
public class HomeController : AuthorizeBaseController
{
public ActionResult Index()
{
return View();
}
}
该 [Authorize]
属性应该影响新基类的所有后代。
编辑 我使用的问题 <location path="" >
方法是,由于路由引擎使得任何路由都可以调用任何控制器,因此基于url(因此是特定路由)而不是控制器动作设置授权可以调用应该受保护的控制器并跳过授权。这不是webforms中的问题,因为页面是一个页面(而不是方法调用),但是MVC中页面/路径和代码之间的分离使得这成为一个巨大的安全漏洞。
一种方便的方法是创建一个新的基类
[Authorize]
public abstract class AuthorizeBaseController : Controller
{
}
并确保您需要授权的所有控制器(在您的情况下,您所关注的区域中的所有内容)都来自 AuthorizeBaseController
。
public class HomeController : AuthorizeBaseController
{
public ActionResult Index()
{
return View();
}
}
该 [Authorize]
属性应该影响新基类的所有后代。
编辑 我使用的问题 <location path="" >
方法是,由于路由引擎使得任何路由都可以调用任何控制器,因此基于url(因此是特定路由)而不是控制器动作设置授权可以调用应该受保护的控制器并跳过授权。这不是webforms中的问题,因为页面是一个页面(而不是方法调用),但是MVC中页面/路径和代码之间的分离使得这成为一个巨大的安全漏洞。
该 只要 在MVC应用程序中执行此操作的安全方法是执行David建议的操作 - 归因于基本控制器并将所有控制器放在基本控制器的区域子类中。
在MVC中使用<location>标签进行授权 将 在您的应用程序中打开安全漏洞您对保护URL或路由不感兴趣。您希望保护控制器本身,因为它们是您尝试保护的实际资源。因此,需要将保护直接放在控制器上。
此外,请记住,某个区域实际上只是一种奇特的分组方式 路线,而不是控制器。尝试使用花哨的逻辑来检测当前区域并推断授权设置也会在应用程序中打开安全漏洞。
正如已经建议的那样,你可以利用 <location />
web.config中的元素。否则,您可以使用每个区域的基本控制器类并使用 AuthorizeAttribute 以便从中继承的所有控制器也被过滤掉。
你可以随时使用
<location path="" >
<system.web>
<authorization>
deny or allow
</authorization>
</system.web>
</location>