6

我已經3個模型[用戶,角色,和的UserRole]基於角色的授權與標準清單

 
Use {ID [PK], Name, Email, Password, .....} 
Role {ID [PK], Name, Description, .......} 
UserRole {UserID [FK], RoleID [FK]} 

考慮,使用[授權]上控制器基於角色的授權屬性指定用戶必須在管理員角色來訪問類

[Authorize(Roles = "Administrator")] 
public class PageController : Controller 
{ 
    // Controller code here 
} 

這是好的,我需要的是任何控制器動作,

有什麼辦法,以我的角色集合分配到[Authoriz e]屬性?例如

我將從登錄用戶中獲取已分配角色並將其存儲在列表中。是否可以將此列表分配給[授權]屬性?如下所示:

[Authorize(Roles = MyDynamicallyLoadedList)] 
public class PageController : Controller 
{ 
    // Controller code here 
} 
+0

1+,投票,很好的問題.... –

回答

1

好吧,有兩個問題。

首先,您不能使用List作爲Attribute的參數。您可以改爲使用數組。 http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx

其次,在編譯時必須知道屬性參數的值:只有在運行時才能知道列表的內容。

你會得到這樣的消息:

的屬性參數必須是常量表達式的typeof屬性參數類型

解決方案是創建的表達 或數組創建表達式一個新的授權屬性(繼承自AuthorizeAttribute)和覆蓋AuthorizedCore

一個示例(您可以適應您的問題)可以發現here

1

是的。在global.asax中

  1. 覆蓋PostAuthenticateRequest
  2. 負載從分貝
  3. 角色創建一個新的GenericPrincipal
  4. 分配委託人Thread.CurrentPrincipalHttpContext.Current.User

實施例:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name); 
     HttpContext.Current.User = new GenericPrincipal(User.Identity, rolelist); 
     Thread.CurrentPrincipal = HttpContext.Current.User; 
    } 
} 
+0

你可以建議我一些教程或博客,所以我可以去一步一步 –

+0

我添加了一個例子 – jgauffin

+0

老兄,對不起,我很新,你能否給我提供一些更詳細的例子?以及這可以如何應用於控制器的[授權]屬性? –