2010-11-19 118 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"); 
    } 

} 

实际主体/身份配置如何设置取决于您的库的用户。