什么是保护您的Web应用程序在asp .net mvc中的某些领域的最佳途径。我知道我们可以在每个动作中放入[Authorization]
属性,但这似乎非常单调乏味,因为您必须将它放在所有位置。我正在使用会员供应商,并尝试通过设置基于该文件夹的保护来回发模式。我使用web.config <location>
部分来保护一些文件夹。我在mvc中试过,它似乎在工作,但大部分教程都使用了[Authorization]
的方式。asp .net mvc授权
哪一个是更好的方法?
什么是保护您的Web应用程序在asp .net mvc中的某些领域的最佳途径。我知道我们可以在每个动作中放入[Authorization]
属性,但这似乎非常单调乏味,因为您必须将它放在所有位置。我正在使用会员供应商,并尝试通过设置基于该文件夹的保护来回发模式。我使用web.config <location>
部分来保护一些文件夹。我在mvc中试过,它似乎在工作,但大部分教程都使用了[Authorization]
的方式。asp .net mvc授权
哪一个是更好的方法?
我强烈建议不要把它放在web.config中。实际上,Conery,Hanselman,Haack和Guthrie也是如此 - 尽管不是很高(职业ASP.NET MVC 1.0的p223)
路由可能会发生变化,特别是在MVC中。借助WebForm模型,路由在文件系统上实际表现出来,因此您不必担心它。在MVC中,由于缺乏更好的术语,路由是“动态的”。
您最终可能会遇到多个映射到一个控制器的路由,从而导致web.config中的维护困难。更糟糕的是,您可能无意中让路由无意中调用了控制器,或者在添加/修改路由并忘记打开后忘记更新web.config。
但是,如果您保护您的控制器而不是实际的路由,那么您不必担心保持web.config与控制器的连接和更改路由保持同步。
只是我2美分。
将[授权]放在控制器类的顶部。这将锁定整个控制器操作。
一个可能的解决方案是创建一个“受保护控制器”,并把它作为一个基类,你要保护
[Authorize]
public class ProtectedBaseController : Controller {
}
public class AdminController : ProtectedBaseController {
...
}
public class Admin2Controller : ProtectedBaseController {
...
}
你可以把[授权]每一个位指示该应用程序的所有领域你需要保护。
您可以添加过滤器GlobalFilters.Add(new AuthorizeAttribute());在您的Startup.cs(或Global.asax)中,并将[AllowAnonymus]属性放置到允许非注册用户使用的任何控制器或操作中。
如果您选择将[Authorize]放入每个安全控制器,您需要确保您或团队中其他人添加的任何控制器都是安全的。对于这个要求,我用这样的测试:
[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更好,因为它使不能保证您的系统拥有的所有控制器的安全。这种方式也不会使用继承,这会使项目更重。
好的谢谢。问题是哪一个更好,把它放在所有的控制器中,或者将它设置在一个文件web.config中。我选择web.config。 – dritterweg 2009-07-15 11:21:00
是的,很难不同意。 :) – griegs 2009-07-16 02:58:05