2016-10-28 71 views
4

我正在處理asp.net mvc 5.我想要將控制器的動作方法的權限動態分配給角色,而無需在Authorize屬性中硬性地賦予角色。動態地爲asp.net MVC中的角色分配控制器操作權限

這是場景 - 在我的項目中,我有四個角色 - 學生,教師,項目官員和管理員。 我希望管理員可以隨時更改每個角色的可訪問性。我不想在控制器的每個操作名稱之前使用角色名稱對授權屬性進行硬編碼,因爲管理員無法更改每個角色的權限。

我想創建一個頁面,其中控制器的每個操作方法都將被列爲複選框,並且管理員可以爲角色選擇操作複選框。那麼角色用戶將獲得這些操作方法的可訪問性。

在這裏,我想使用戶界面如下 -

Role Management UI

任何人都可以請幫我做這件事給予任何建議或代碼或鏈接?

+0

您是否已經在項目中使用角色? – SeM

+0

這裏我從AspNetRole表中檢索了角色。我種下這個桌子有四個角色。但我擔心的是,我可以如何讓管理員將操作方法​​的權限從UI分配給角色。此用戶界面用於演示目的。我想要像這樣創建。 –

+0

我已經問過這個問題,知道您是使用分配角色還是使用否的部分,所以如果是的話,當您檢查/取消選中複選框時,您只需要使用該部分。 – SeM

回答

1

我認爲唯一的方法是實現您自己的授權屬性,您可以在其中實現自己的授權邏輯。

在你的情況下,你應該有一個表,其中相關角色和控制器的行動,並檢查您的自定義授權屬性中的此表。

4

想象一下,你有服務基於控制器和動作名稱這樣它返回角色的數組:

public class RoleProvider 
{ 
    public string[] Get(string controller, string action) 
    { 
     // get your roles based on the controller and the action name 
     // wherever you want such as db 
     // I hardcoded for the sake of simplicity 
     return new string[]{"Student", "Teacher"}; 
    } 
} 

現在,您可以編寫自己的授權屬性是這樣的:

public class DynamicRoleAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var controller = httpContext.Request.RequestContext 
      .RouteData.GetRequiredString("controller"); 
     var action = httpContext.Request.RequestContext 
      .RouteData.GetRequiredString("action"); 
     // feed the roles here 
     Roles = string.Join("," ,_rolesProvider.Get(controller, action)); 
     return base.AuthorizeCore(httpContext); 
    } 
} 

現在使用您的自定義授權屬性而不是像這樣的舊版本:

[DynamicRoleAuthorize] 
public ActionResult MyAction() 
{ 

} 
+0

嗨,你可以編輯或修改這個如何從性能的方式從一個Db或配置文件獲取角色,所以我們可以'角色= string.Join(「,」,_rolesProvider.Get(controller,action));'這將是一個很大的幫助。因爲,當我在代碼中嘗試這個時,它在編譯期間抱怨! – transformer

+0

角色映射在哪裏進行處理,即在何處配置,重新保存和檢查?另外,這可以處理運行時,還是需要重新啓動應用程序?在你的解決方案中請澄清我感興趣 – transformer

+1

@transformer'roleProvider'是一個假想的類,它負責根據控制器和操作獲取相關角色。你可以自己寫。想象一下,你在數據庫中有一個表格,併爲每個控制器分配角色,然後通過這個類別獲取指定的角色。每次調用某個操作時都會處理角色映射,因此如果您分配了新角色,則無需重新啓動應用程序。 –

1

雖然這不會給你所需的動態網頁分配,但如果你的方法很靈活......你可以設置一個Enum list of Roles Admin, Editor editor etc,並將它們作爲參數對象(ENUM)作爲參數傳遞,所以該DynamicRoleAuthorize可以使用它加載所允許

vivians blog構造函數接受的對象類型的參數的作用,即小動作。如果使用Enum類型的參數,則會得到與上面相同的錯誤消息。我們可以這樣做,因爲Enum是一個對象。 爲了確保我們傳遞Enum類型的參數,我們檢查每個角色的類型。如果一個角色不是Enum類型,那麼構造函數將拋出一個ArgumentException異常。 然後我們用string.Join方法將我們的角色名稱設置爲標準Roles屬性。

using System; 
using System.Linq; 
using System.Web.Mvc; 

namespace MvcApplication.HowTo.Attributes 
{ 
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class AuthorizeEnumAttribute : AuthorizeAttribute 
{ 
    public AuthorizeEnumAttribute(params object[] roles) 
    { 
     if (roles.Any(r => r.GetType().BaseType != typeof(Enum))) 
      throw new ArgumentException("roles"); 

     this.Roles = string.Join(",", roles.Select(r => Enum.GetName(r.GetType(), r))); 
    } 
    } 
} 
相關問題