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

时间:2014-04-03 16:48:07

标签: permissions wif claims-based-identity claims

给定一组特定的权限,例如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的用户。

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

非常感谢任何想法或反馈。

1 个答案:

答案 0 :(得分:11)

嗯 - 您还没有提供有关您意图的更多详细信息 - 但如果您打算将这些声明作为用户身份的一部分 - 这显然是一种反模式。

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

在这个可扩展性点,您可以根据

做出明智的决定

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

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