7

我將ASP.NET MVC添加到現有的WebForms應用程序中。目前,我不關心認證/登錄,因爲這部分是由現有代碼(Forms認證)處理的。ASP.NET MVC3中基於權限的授權

在現有的WebForms應用程序中,我們爲每個頁面提供了完全自定義的基於權限的授權。因此,每個用戶都有一組權限,列出他可以訪問的頁面。
現在我需要決定如何使用相同的權限系統來限制對特定MVC控制器和操作的訪問。

據我所知,對於ASP.NET MVC有一個標準的AuthorizeAttribute我可以指定角色。我也發現了一些文章這表明指定的權限,而不是角色 - 那麼它可能做這樣的事情:

[CustomAuthorize(Roles = "View products, Edit products")] 

通過擴展AuthorizeAttribute,我還可以定義我是如何存儲和訪問權限。

這個解決方案對我來說是可以接受的(儘管改變角色的語義有點味道)。
但在提交之前,我想看看還有哪些其他選項。這就是我陷入困境的地方 - 我還沒有找到關於ASP.NET MVC授權的不同方法的完整概述。我也想知道所有的安全概念(如表單身份驗證,成員資格提供者,授權屬性,IPrincipal等)是如何相互關聯的,以及它們應該如何協同工作。

+0

這是類似於什麼在這裏嘗試:http://stackoverflow.com/questions/10338734/custom-security-scenario-in-asp-net-mvc/ – antijon 2012-04-26 21:42:01

+0

@antijon據我瞭解,它類似於實現一個自定義的AuthorizeAttribute。但我想更詳細地瞭解其他選項及其優缺點。 – 2012-04-26 21:48:01

回答

7

你必須明白的第一件事就像Webforms一樣,MVC中有一個管道。每個請求都經過許多方法,並且沿途有擴展點,可以「掛鉤」並執行操作。

所有AuthorizeAttribute都會掛鉤到OnAuthorization擴展點,並根據您提供給它的標準(用戶名,角色等)決定是否允許某人訪問。

下面是一個例子:http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

您可以創建自己的自定義授權屬性,做同樣的事情有自己的標準。你不需要重新定義角色參數,如果你願意,你可以創建你自己的全部。

這是MVC更喜歡的方法。另外一件好事是,如果您還將其設爲過濾器,那麼您可以將其添加到全局過濾器,並將其應用於所有內容(如果需要的話)。

你基本上有兩個其他合理的選擇。在Application_AuthenticateRequest(不推薦)中的global.asax中實現一個處理程序,或者創建一個覆蓋OnAuthorize(該屬性掛鉤同一事物,但位於不同位置)的公共BaseController。

許多人嘗試使用會話變量進行身份驗證,而這只是最糟糕的事情。

由於我們對您的身份驗證和權限系統一無所知,我們所能做的只是提供一般性建議。

+0

謝謝你的回答!關於身份驗證 - 這只是通過Forms Auth登錄並使用自定義用戶類的用戶名/密碼登錄。關於權限系統 - 對於每個頁面,我們定義了一個「模塊鍵」,並且我們在數據庫中存儲每個用戶訪問每個頁面的權限。檢查權限目前在'BasePage:Page'中實現。我不確定這是否是您想知道的信息? – 2012-04-27 08:26:30