MVC5身份验证:在每个控制器或基本控制器上授权属性

时间:2014-04-16 13:12:18

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

我一直在研究保护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 Identity和OWIN身份验证) - 任何人都可以了解每种方法的优缺点吗?

2 个答案:

答案 0 :(得分:20)

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,其中包含auth cookie,该cookie容易受到中间人的攻击如果通过常规HTTP进行攻击。

答案 1 :(得分:0)

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

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

通常,我们所有的控制器都不允许基于我们的baseController类进行匿名访问。从那里它变得如此复杂。但是对于像这样的事情使用基类并在此基础上构建总是有意义的。如果您需要快速进行非常广泛的系统更改,请将其点击到baseClass中即可。