在asp .net mvc中保护Web应用程序某些区域的最佳方法是什么?我知道我们可以在每个动作中加上[Authorization]
属性,但这似乎非常繁琐,因为你必须把它全部放在一起。我正在使用成员资格提供程序,并通过基于该文件夹设置此保护来尝试我以前在回发模型中的方式。我使用web.config <location>
部分来保护一些文件夹。我在mvc中尝试了这个,它似乎正在工作,但大多数教程都使用[Authorization]
方式。
哪一个是更好的方法?
答案 0 :(得分:5)
我强烈建议不要将它放在web.config中。实际上,Conery,Hanselman,Haack和Guthrie也是如此 - 尽管不是很高(专业ASP.NET MVC 1.0的第223页)
路由可能会发生变化,尤其是在MVC中。使用WebForm模型,路由在文件系统上实际表示,因此您不必担心它。在MVC中,由于缺乏更好的术语,路线是“动态的”。
最终可能会有多个路由映射到一个控制器,从而导致web.config中的维护工作变得很麻烦。更糟糕的是,您可能无意中让路由意外地调用了控制器,或者在添加/修改路由后忘记更新web.config并让自己保持打开状态。
但是,如果您保护控制器而不是实际路由,那么您无需担心web.config与控制器的运行和更改路由保持同步。
只需2美分。
答案 1 :(得分:4)
一种可能的解决方案是创建一个“受保护的控制器”,并将其用作您要保护的应用程序所有区域的基类
[Authorize]
public class ProtectedBaseController : Controller {
}
public class AdminController : ProtectedBaseController {
...
}
public class Admin2Controller : ProtectedBaseController {
...
}
答案 2 :(得分:3)
将[Authorization]放在控制器类的顶部。这将锁定整个控制器的动作。
答案 3 :(得分:0)
您可以将[授权]放到您需要保护的每个控制器上。
您可以添加过滤器GlobalFilters.Add(new AuthorizeAttribute());在您的Startup.cs(或Global.asax)中,将[AllowAnonymus]属性放入您允许非注册用户使用的任何控制器或操作。
如果您选择将[授权]放入每个安全控制器,您需要确保您或团队中的任何其他人添加的任何控制器都是安全的。对于这个要求,我使用这样的测试:
[Fact]
public void AllAuth()
{
var asm = Assembly.GetAssembly(typeof (HomeController));
foreach (var type in asm.GetTypes())
{
if (typeof(Controller).IsAssignableFrom(type))
{
var attrs = type.GetCustomAttributes(typeof (AuthorizeAttribute));
Assert.True(attrs.Any());
}
}
}
我认为这种方式比创建ProtectedContoller更好,因为它不能保证您的系统安全地拥有所有控制器。这种方式也不使用继承,这会使项目更重。
答案 4 :(得分:0)
授权是保护应用程序安全的一种方法;将属性应用于每个控制器。 另一种方法是在登录和注册操作上使用新的 AllowAnonymous 属性。 根据当前区域做出安全决策是一件很糟糕的事情,这会使您的应用程序容易受到攻击。
您可以获得here
的代码由于ASP.NET MVC 4包含新的AllowAnonymous属性,因此您无需再编写该代码。
在global.asax中全局设置AuthorizeAttribute之后,将其列入白名单即可。
您想要退出授权的这种方法被认为是保护操作方法的最佳实践。谢谢。