2014-04-03 60 views
12

给定一组特定的权限,例如EditPage,CreateProject,ModifyUser,我目前正在寻找两种不同的方法来创建一些自定义声明类型来模拟此行为。我可以在网上找到很少的信息,告诉你如何做到这一点,并希望得到一些关于你如何在自己的系统中做到这一点的反馈。创建自定义声明类型的最佳做法

我考虑的第一个方法是使用一个“行动”,根据权利要求型,具有由权利要求的值所指定的特定操作:

var claims = new [] 
{ 
    new Claim("http://schemas.company.com/claims/project/action", "EditPage"), 
    new Claim("http://schemas.company.com/claims/project/action", "CreateProject"), 
    new Claim("http://schemas.company.com/claims/project/action", "ModifyUser") 
} 

第二种方法是使用权利要求类型本身要定义正在执行的操作,则不使用该值。这就像一种“PossessProperty”安全风格,只要用户拥有索赔类型,他们就可以执行该操作。

var claims = new [] 
{ 
    new Claim("http://schemas.company.com/claims/project/editpage", ""), 
    new Claim("http://schemas.company.com/claims/project/createproject", ""), 
    new Claim("http://schemas.company.com/claims/project/modifyuser", "") 
} 

还要注意,在声明类型以上我已经包含了“工程”的鉴别,这样我可以谁就能在A计划编辑页面而不是项目B.

用户区分我们还计划将所有这些自定义声明存储在中央“授权”数据库中,因此需要唯一性。

任何想法或反馈将不胜感激。

回答

9

嗯 - 你没有提供关于你意图的更多细节 - 但是如果你打算让这些声明成为用户身份的一部分 - 这显然是一种反模式。

声明描述了用户的身份(可能包括角色等粗粒度授权数据)。为了制作更细粒度的授权决策,请使用.NET中的ClaimsAuthorizationManager。

在这个扩展点,你根据

一个明智的决定

一)用户 B中的资源的用户试图访问 C)的用户尝试在做的工作)的身份资源

换句话说 - 索赔是您的授权决定的输入,而不是直接的答案。

+0

谢谢,我希望你会对此作出回应。我非常喜欢你的Pluralsight视频。我实际上使用ClaimsAuthorizationManager,但尚未开始实施这些策略。要求具有非常好的安全性,因此用户被授予执行特定操作的特定权限,例如,上传图片,修改页面等。我认为特定的权利/行为/权限将被建模为个人声明。但是你说这是一种反模式。那么这整个细粒度的安全性是否是一种反模式?我现在更加困惑。 – mikesigs

+1

根本没有;)只是不要使所有这些声明的ClaimPrincipal的一部分。 – leastprivilege

+0

因此,“行动”索赔不再是索赔。在声明转换期间,它们不会与ClaimsPrincipal一起存储。但相反,授权管理器将不得不通过一些服务调用/ db查找来检查特定的权限?我希望有一组静态的策略,但这不适用于此模型。 – mikesigs

相关问题