2009-07-15 138 views
2

什么是保护您的Web应用程序在asp .net mvc中的某些领域的最佳途径。我知道我们可以在每个动作中放入[Authorization]属性,但这似乎非常单调乏味,因为您必须将它放在所有位置。我正在使用会员供应商,并尝试通过设置基于该文件夹的保护来回发模式。我使用web.config <location>部分来保护一些文件夹。我在mvc中试过,它似乎在工作,但大部分教程都使用了[Authorization]的方式。asp .net mvc授权

哪一个是更好的方法?

回答

4

我强烈建议不要把它放在web.config中。实际上,Conery,Hanselman,Haack和Guthrie也是如此 - 尽管不是很高(职业ASP.NET MVC 1.0的p223)

路由可能会发生变化,特别是在MVC中。借助WebForm模型,路由在文件系统上实际表现出来,因此您不必担心它。在MVC中,由于缺乏更好的术语,路由是“动态的”。

您最终可能会遇到多个映射到一个控制器的路由,从而导致web.config中的维护困难。更糟糕的是,您可能无意中让路由无意中调用了控制器,或者在添加/修改路由并忘记打开后忘记更新web.config。

但是,如果您保护您的控制器而不是实际的路由,那么您不必担心保持web.config与控制器的连接和更改路由保持同步。

只是我2美分。

2

将[授权]放在控制器类的顶部。这将锁定整个控制器操作。

+0

好的谢谢。问题是哪一个更好,把它放在所有的控制器中,或者将它设置在一个文件web.config中。我选择web.config。 – dritterweg 2009-07-15 11:21:00

+0

是的,很难不同意。 :) – griegs 2009-07-16 02:58:05

3

一个可能的解决方案是创建一个“受保护控制器”,并把它作为一个基类,你要保护

[Authorize] 
public class ProtectedBaseController : Controller { 

} 

public class AdminController : ProtectedBaseController { 
    ... 
} 

public class Admin2Controller : ProtectedBaseController { 
    ... 
} 
0

你可以把[授权]每一个位指示该应用程序的所有领域你需要保护。

您可以添加过滤器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更好,因为它使不能保证您的系统拥有的所有控制器的安全。这种方式也不会使用继承,这会使项目更重。