2009-12-22 56 views
1

我有一定的要求設計一個WCF服務爲基礎的系統來篩選在C#中的角色要求如何設計一個系統來過濾角色上的請求?

Rules 
    User can access X 
    SuperUser can access Y 
    Admin can access Z 

    Database 
    Resource AccessControl 
    X  User,SuperUser,Admin 
    Y  Admin 
    Z  Admin 

如何創建一個系統,我可以把這些accesscontrols變得像一個散列或計算的數學值,使得我沒有做多的檢查,像

If(user = RequestUser.Role.User||user = RequestUser.Role.Admin) 
{} 

而是做這樣的事情

Resource AccessControl    someCalculatedHashValue 
    X  User,SuperUser,Admin  ???? 
    Y  Admin     ???? 
    Z  Admin     ???? 

if(user >= someCalculatedHashValue){} 

注:有可能是一對多的關係圖

+0

用戶是否只有一個角色? – 2009-12-22 16:29:05

+0

可能有多個角色 – 2009-12-22 16:46:13

回答

0

你不能爲你的角色使用位向量(即: Flags枚舉)?

這樣你可以簡單地將這些位加起來作爲你的「散列」。

0

您可以通過包裝您描述的排名邏輯來創建實現IsInRole的IPrincipal的自定義實現。


現在我仔細看看你的問題,聽起來很像基於ACL的安全性,而不是基於角色的安全性。您可能需要改爲look at this

0

您未能提供有關係統的詳細信息。根據所使用的技術,已經有成熟和熟知的技術來管理這個(例如WCF爲你提供這個「免費」)。

的樣本可能是不完全或者,因爲你的方式呈現它

用戶,超級用戶,管理員
聯繫
聯繫

這可以用一個簡單的枚舉處理和一個int比較和這樣一個枚舉:

public enum Role { 
    Anonymous, 
    User, 
    SuperUser, 
    Admin 
} 

if (user >= (int)Role.User) ... 

但是,這可能太簡單,不包括你的真正需要?總之:你能詳細說明一下嗎?

+0

假設這是在WCF中完成的,有什麼可用的開箱即用的? – 2009-12-22 16:41:41

+0

WCF允許您根據您的設計以聲明方式進行授權(如果沒有聲明)。如果您希望/需要在Code中執行此操作,它也會支持您,但最終會出現同樣的問題,必須將角色映射到操作。 所以 - 那時你會回到你的「如果一團糟」或回到開頭。您可以查看枚舉,也可以探索是否可以將邏輯提取爲擴展方法或類似的東西,這可以實現訪問權限和角色/用戶之間的映射。 – 2009-12-22 20:35:41