身份驗證前呼叫的 ASP.NET MVC 控制器建構子
我有一個 ASP.NET MVC 應用程序,它的控制器看起來像這樣:
[Authorize] public class MyController : Controller { IMyRepository myRepository; public MyController(IMyRepository myRepository) { this.myRepository = myRepository; } ... }我注意到這個建構子在驗證使用者之前被呼叫,所以如果你是第一次訪問這個頁面,建構子會在你重定向到登錄螢幕之前被呼叫。這有很多問題,登錄頁面載入速度較慢,該站點更容易受到 DOS 攻擊,而且我對未經身份驗證的、未經授權的使用者能夠呼叫“牆後”的程式碼有點緊張。
除非使用者被授權,否則我可以在建構子中檢查傳入請求並保釋,但我使用的是 IOC (Windsor),這有點棘手,無論我是否儲存實例,我的儲存庫都將被初始化,所以我將在每個儲存庫的建構子中檢查身份驗證。有沒有一種簡單的方法可以讓 .NET MVC在呼叫建構子*之前對使用者進行身份驗證?*我正在考慮添加
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]到控制器中,但可能還有更好的方法。編輯:
好吧,不太高興,但節目現在必須繼續。我不能延遲初始化儲存庫,直到控制器內的某個稍後時間點。當您的控制器像我的範例中那樣使用 IOC 時,您會在實例化控制器時獲得儲存庫介面的已實例化實現。如果我可以控制正在創建的儲存庫,我可以輕鬆地呼叫 IsAuthenticated,而無需使用新方法。為了控制儲存庫初始化,您必須在每個實現中的儲存庫本身中實現某種延遲/延遲初始化。我不喜歡這個解決方案,因為它增加了不必要的複雜性,更重要的是控制器和儲存庫之間的耦合。
您可以使用 HttpModules(或 HttpHandler)在管道中更早地對請求進行身份驗證。
編輯
隨著OWIN的引入,您可以配置整個請求管道中間件並將授權放在您想要的任何階段。與上面相同的想法,但更容易實現。
OnAuthorization控制器需要在授權發生之前被實例化,因為它可以通過該方法充當自己的授權過濾器。改變這種行為將涉及替換 mvc 管道的一些核心部分。AuthorizedAttribute您認為它可能無法發揮作用有什麼特別的原因嗎?您可以考慮的另一個選項是在
OnActionExecuting您的控制器方法中而不是在建構子中初始化您的儲存庫。