什麼是保護您的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