创建自定义声明类型的最佳做法

mik*_*igs 13 permissions claims-based-identity claims wif

给定一组特定的权限,例如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")
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用声明类型本身来定义正在执行的操作,不使用该值.这就像"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", "")
}
Run Code Online (Sandbox Code Playgroud)

另请注意,在上面的索赔类型中,我包含了一个"项目"鉴别器,以便我可以区分可以编辑项目A中的页面而不是项目B的用户.

我们还计划将所有这些自定义声明存储在中央"授权"数据库中,因此需要唯一性.

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

lea*_*ege 11

好吧 - 你还没有提供更多关于你意图的细节 - 但如果你打算将这些声明作为用户身份的一部分 - 这显然是一种反模式.

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

在这个可扩展性点,您可以根据以下内容做出明智的决定

a)用户的身份b)用户试图访问的资源c)用户试图对资源进行的操作

换句话说 - 声明是您授权决策的输入,而不是直接答案.