2010-11-19 170 views
9

我有一個類庫包含我的數據庫訪問層,我用它在我的所有項目中使用這個數據庫,現在我想在這個庫中集成安全性,所以我可以返回不同的數據爲不同的安全角色。用.NET內置安全性實現這個最好的方法是什麼? 我想使用System.Security.Permissions.PrincipalPermission,但我看不出它如何能幫助我,因爲我使用圖書館任何人都可以這樣寫C#基於角色的安全

GenericIdentity genericIdentity = new GenericIdentity("User"); 
GenericPrincipal genericPrincipal = new GenericPrincipal(genericIdentity, new[] { "Administrator" }); 
Thread.CurrentPrincipal = genericPrincipal; 

客戶端應用程序並且他們將通過我的所有主要許可要求

PrincipalPermission principalPermission = new PrincipalPermission(null, "Administrator"); 
principalPermission.Demand(); 

甚至沒有驗證。 要麼我不明白這個安全模型,或者它只是不能保證任何東西。

+0

2年後讀我自己的問題,這是一個多麼愚蠢的問題 - ) – 2012-11-15 17:48:56

回答

5

基於角色的安全性旨在作爲庫代碼使用客戶端選擇的安全模型而不需要知道實現的方式;關鍵在於您已經處於合理地信任客戶端安全模型的階段,並且您只是想根據客戶端做出的決策提供適當的選項(例如作爲登錄過程的一部分)。

如果信任的客戶端,所有的賭注都關閉反正,因爲他們可以只使用反射來撕裂你的內部撕成碎片。在這種情況下,最好將實現代碼保持爲私有,例如通過以某種方式接受用戶憑證的Web服務。然後,他們只能是他們擁有憑據的帳戶。

+0

你是對的,實際上軟件客戶端(使用這個庫的應用程序)是可信的,我自己寫了它們,但是我有很多這個庫的前端(服務),如WEB,WCF,桌面,我希望我所有的身份驗證都在這個庫中。 – 2010-11-19 13:47:44

+0

@BrokenPipe - 那麼也許你可以單獨聲明權限必須是給定的具體實現? (用'is')? (只有您的代碼可以發出) – 2010-11-19 13:49:25

+0

您是否正在驗證所有針對一個安全性存儲,如Active Directory?或AD和SQL Server? – 2010-11-19 13:50:34

0
public class Example 
{ 

    // Will enforce that the user have the administrator role 
    [PrincipalPermission(XXXX, Role="Administrator")] 
    public void Remove(int userId) 
    { 
    } 

    public void Add(int userId) 
    { 
    if (!Thread.CurrentPrincipal.IsInRole("User")) 
     throw new UnauthorizedAccessException("Only registered users may add users"); 
    } 

} 

實際主體/身份配置如何設置取決於您的庫的用戶。