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