2009-07-15 206 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更好,因爲它使不能保證您的系統擁有的所有控制器的安全。這種方式也不會使用繼承,這會使項目更重。