【问题标题】:MVC5 Authentication: Authorize attribute on every controller or base controllerMVC5 身份验证:授权每个控制器或基本控制器上的属性
【发布时间】:2014-05-31 09:20:50
【问题描述】:

我一直在对保护我的 MVC 5 应用程序的最佳方法进行大量研究。

我们有一个包含许多 WebAPI 控制器的 Web.csproj 以及一个包含两个区域的 MVC 站点 - 一个用于管理员,然后是面向公众的网站。

阅读this article which states that the Base Controller is best way后,我决定采用这种方法。

但是,我个人不同意使用基本控制器(出于我的某些原因,see this stackoverflow answer)。

那么,鉴于我使用的是 MVC 5(ASP.Net 身份和 OWIN 身份验证) - 任何人都可以阐明每种方法的优缺点吗?

【问题讨论】:

  • 这篇文章不是展示了如何使用全局过滤器吗?我相信基本控制器被推荐用于 MVC 1 和 2....
  • @dima 是的,你是对的......我对文章底部的以下引用感到困惑:“让我非常清楚这一点。保护 MVC 的唯一受支持的方式应用程序是拥有一个具有 [Authorize] 属性的基类,然后让每个控制器类型子类化该基类型。任何其他方式都会打开一个安全漏洞。”但是,我认为是在尝试通过路由约束保护 MVC 应用程序的上下文中说的……一个严重的“不可以”。
  • 他在某种程度上是对的,只是应该说关于全局过滤器....我不明白您为什么不利用全局过滤器并确保整个站点的安全并且只允许匿名访问某些操作,如登录、注册等
  • 所以要回答您的问题 - 既不是,也不是基本控制器,也不是在每个控制器或操作上放置 Authorize 属性......全局过滤器是这些天要走的路......你不需要发明已经存在的东西

标签: asp.net-mvc-5 asp.net-identity owin authorize-attribute


【解决方案1】:

MVC 5 中的当前做法是将AuthorizeAttribute 应用为全局过滤器,并使用AllowAnonymousAttribute 打开单个操作/控制器

所以在 App_Start\FilterConfig.cs 中添加以下行:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        ... existing filters

        // use the [AllowAnonymous] attribute to open up individual Actions/Controllers
        filters.Add(new System.Web.Mvc.AuthorizeAttribute());
        filters.Add(new RequireHttpsAttribute());
    }

注意: 为了更好地衡量,我还添加了 RequireHttpsAttribute,因为使用 ASP.Net Identity 的每个经过身份验证的请求都带有身份验证 cookie,这很容易受到中间人的攻击如果通过常规 HTTP 进行攻击。

【讨论】:

    【解决方案2】:

    我总是会使用基本控制器,不仅仅是身份验证和授权...

    为了回答您的问题,我们最终做的是使用所有都继承自 AuthorizeAttribute 的复杂规则滚动我们自己的自定义授权属性。它非常简单,您只需从给定属性继承,然后覆盖 OnAuthorization 和 AuthorizeCore 方法。

    通常,基于我们的 baseController 类,我们所有的控制器都不允许匿名访问。从那里开始,它变得根据需要变得复杂。但是为这样的事情使用基类并在此基础上进行构建总是有意义的。如果您需要快速进行非常广泛的系统更改,您可以将其接入基类,仅此而已。

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多