2012-03-07 83 views
1

很多文章在網上的訪問講asp.net MVC基於角色的訪問控制來

[Authorize(Roles = "Admin, Manager")] 
public class SomeController : Controller 
{ 

} 

這一切是好的,但現在如果我需要實現我自己的基於角色的自定義訪問,其中我在[RoleMaster]表中具有角色,並且在另一個名爲[UserRoles]的表中的[User]表中分配給用戶的角色。在我的代碼將在會話中的用戶對象現在將在它

public class RegisteredUsers 
{ 

    //... other user properties 

    public List<UserRole> Roles { get; set; } 

} 

public class UserRole 
{ 

    public string RoleID { get; set; } 
    public string RoleName { get; set; } 
    //... other properties 

} 

現在我該如何檢查在RegisteredUsers角色列表中UserRole.RoleName屬性角色列表對象作爲反對任何匹配我已使用以下屬性分配給Authorize屬性的值:[Authorize(Roles =「Admin,Manager」)]]。在某些情況下,如果角色具有管理員或管理員,他們應該可以訪問。在某些情況下,我希望他們既具有管理員角色也具有管理角色以獲得訪問權限。

而且,在未來如果有新的角色會添加到系統中,我將需要重建,並與所有授權屬性重做重新部署應用程序?

我一直沒能找到任何明顯的例子,實現相同的,或者是我不正常搜索。請儘可能以任何方式幫助我。感謝您的時間...

回答

3

您需要實現自定義IPrincipal(或自定義RoleProvider,但在我看來IPrincipal更容易)。

在你的窗體身份驗證控制器,驗證對用戶表,並從自己的角色表中的角色創建一個IPrincipal。您可能還希望在與角色處於同一位置時設置Forms Auth cookie,因此您無需在每個請求(或使用會話)中都擊中數據庫。查看this question中的代碼,瞭解此方法的示例。

如果你沒有在你的用戶的任何自定義屬性,您可以使用內置的GenericIdentity和的GenericPrincipal。

編輯 - 如果你在會話中存儲用戶信息,你只需要確保你在每個請求開始時設置HttpContext.Current.User到您的會話衍生的IPrincipal(OnPostAuthenticate)

您將需要重建/重新部署,以應付這種方法的新角色。如果你想動態分配角色並在運行時處理它們,你需要實現一個自定義的AuthorizationAttribute--這可能需要(例如)一個字符串'Operation'參數,它可以與DB中的角色相匹配。我會親自離開這個,直到它變得明顯,你需要它。

0

聽起來像你可能超過了基於角色的安全設計。如果你需要動態粒度和/或特權,那麼你應該開始至少看看更多的claims-based approach

您可能能夠實現某些(基於聲明的不完整),你是通過實現像上面的鏈接顯示自定義IPrincipal描述什麼。

希望這會有所幫助。