2013-08-19 190 views
3

我需要能夠根據動態角色限制用戶在我的應用程序中可以執行的操作,例如CRUD帶有CRUD角色的ASP.NET MVC授權

例如,用戶/索引需要認證,如[ClaimsAuthorize("View", "User")],因爲我認爲它可以檢查用戶是否有安全性。

我配置了用戶角色,但用戶可以做的角色是動態的。管理員可以使用複選框更改安全級別,以便不同的安全組執行不同的操作。

主要問題是這樣做剃刀,我需要類似於@User.CanEditUsers,但我不知道我怎麼能做到這一點。

任何幫助將不勝感激,因爲我無法找到正確的方式去做這件事。

回答

2

請注意,授權用戶查看特定的頁面元素與授權CRUD或其他數據庫操作不同,除非元素指向Controller中的操作Actions。考慮你可能有一些元素,不需要被特定用戶看到,也沒有特定的數據庫操作。到現在爲止,我們得出結論,我們需要以下權限:

  1. 權限查看
  2. 權限命令

我相信你可以使用Microsoft Role Provider更換零件。根據MSDN文檔考慮到:

通過授權屬性,您可以指定授權爲 ,但僅限於預定義角色或個人用戶。這給你 高度誰有權查看 網站任何頁面上的控制。

在下一步/問題是如何做到這一點?

我認爲3種方式,可滿足我們的宗旨:

  • 解決方案1:創建具有因轉發每個用戶相關查看特定網頁元素的獨立意見。在這種情況下,我們必須 也創建單獨的控制器操作。我們有像[Authorise(Roles="Administrator")]每個動作之前檢查用戶類型 。我們 被迫擁有靜態(預定義)角色和輔助功能。而在 一句話不是因爲冗餘的一個好的解決方案,並 不穩定

  • 解決方案2:簡單地通過在一頁添加用於每個接入限制元件一些if條件創建頁面動態(對於 例如編輯頁)。這就像使用@if (User.IsInRole("Admin"))授權特定用戶,並顯示相關 頁面元素如按鈕。在控制器端,我們可以使用 if條件(因爲添加基於生成/添加的新角色的動態 功能而不是FilterAttribute),並根據數據庫控制有效的 事務。雖然FilterAttribute增加了一些優秀的功能(如性能優化)。一句話適中的解決方案

  • 解決方案3:樣溶液2法,只是 解決問題控制器創建自己的自定義FilterAttribute授權。那將會從AuthorizeAttribute繼承 ,並且會覆蓋OnAuthorize 方法來執行您需要的操作僅適用於操作

例如:

public class TableAuthorizeAttribute : AuthorizeAttribute 
{ 
    public enum TableAction 
    { 
     Read, 
     Create, 
     Update, 
     Delete 
    } 
    public TableAction Action { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     //do custom authorizization using Action and getting TableEntryID 
     //from filterContext.HttpContext.Request.QueryString or 
     //filterContext.HttpContext.Request.Form 
    } 
} 

而其使用量將是這樣的:

[TableAuthorize(Action=TableAuthorizeAttribute.TableAction.Update)] 

Here爲約以上概念完整的示例。下面是創建動態AuthorizeAttribute授權添加到應用程序的新角色的完整示例。

解決方案3一句話完美但複雜的解決方案

請注意,通過在Actions之前使用FilterAttribute,我們將應用程序限於靜態/預定義角色。無需使用其他數據結構或在數據庫中生成表格。

2

您需要將角色的概念與設計中的組分開。

一個角色提供了固定的權限來執行應用程序中的某些操作。一個組是一組用戶。你的管理員真正在做的是將用戶組分配給不同的角色。

您的授權碼應該能夠依靠固定的角色,例如,一個「ViewUserInfo」角色。然後實施管理界面,以便當管理員啓用用戶查看userinfo時,將該用戶添加到「ViewUserInfo」角色。

這同樣適用於組:如果整個用戶組被授予查看用戶信息的權限,則應該將該組添加到「ViewUserInfo」角色。爲了介紹組的概念並能夠將組添加到角色中,您不能依賴標準SimpleRoleProvider,因此您可能必須實現您自己的角色提供者以及組提供者。

最後一些解決方法可能會更容易,但在我看來,這是一個更清潔的架構。

+0

好的,謝謝。你知道有沒有其他開發者試圖實現類似的事情的例子? –

1

從馬的口中說:「角色管理可以幫助您管理授權,這使您可以指定允許應用程序中的用戶訪問的資源。角色管理可讓您將用戶組視爲一個單元,方法是將用戶分配給角色如經理,銷售員,會員等。「 (參考:http://msdn.microsoft.com/en-us/library/5k850zwb%28v=vs.100%29.aspx

用戶可以在多個角色,您可以利用行動篩選器以獲得訪問進行細粒度控制,以在您的網站的各種資源:

[Authorize(Roles="Contributor, Designer, Reviewer")] 

我覺得「動態「你所面對的方面是管理員能夠從提供對這些資源的訪問的角色中按需添加和移除用戶,這是非常典型的。

不斷改變您的角色授予的權限將是一個糟糕的設計選擇。

+0

採取點,歡呼聲。 –