asp.net mvc的区域级安全性

kei*_*en7 11 security asp.net-mvc asp.net-mvc-3

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

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

3Da*_*ave 9

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

[Authorize]
public abstract class AuthorizeBaseController :  Controller
{
}
Run Code Online (Sandbox Code Playgroud)

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

public class HomeController : AuthorizeBaseController
{
  public ActionResult Index()
  {
    return View();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 建议将您的方法作为MVC2的旧方法.完全没有暗示你是不正确的.以下是使用全局过滤器的MVC3新技术和改进技术的链接http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application的.aspx (3认同)

Lev*_*evi 7

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

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

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