范围和索赔(再次!)

时间:2016-07-31 15:02:49

标签: claims-based-identity openid-connect identityserver3 oauth2

我想问一个问题,以确认我对如何使用范围和声明(角色)的理解。假设我有一个用户(用户A具有只读权限,即适合只读的角色),Windows服务(具有只读访问权限的客户端A),MVC站点(具有完全访问权限的客户端B)和Web API。我希望具有完全访问权限和只读访问权限的用户和客户端访问Web API。

  1. 我创建了两个Scopes" sampleApi.full和" sampleApi.read_only"
  2. 我创建了两个角色" full_access"和" read_only"
  3. 我使用RequiredScopes = new [] {" sampleApi.full"," sampleApi.read_only"}
  4. 配置Web API

    当客户端A连接到Web API时,它会传递一个包含Scope" sampleApi.read_only"的访问令牌。我可以在我的类和方法上使用[ScopeAuthorize(" sampleApi.full)]或ScopeAuthorize(" sampleApi.full,sampleApi.read_only")]来微调可访问性。没问题。

    然而,当用户A登录时,他/她继续"客户端的范围B.因此,访问令牌包含" sampleApi.full"," sampleApi.read_only"和Role" read_only"。

    现在我在WebApi遇到了一个问题,我需要在被用户调用时采取不同的行动。在这种情况下,我忽略了范围并使用他/她的角色,而用户获得了#read ;on_"访问这是我想要的。

    这是正确的,使用ScopeAuthorize属性不再有意义,我需要一个自定义混合属性来执行某些操作:

    如果来电者是用户       - 然后使用角色确定可访问性 其他       - 使用范围确定可访问性

    还是我完全被误解了?

1 个答案:

答案 0 :(得分:9)

范围模型允许客户端(非用户)访问的内容。它们在令牌中表现为声明。用户的声明也在令牌中。资源中的授权将基于允许客户端执行的操作和允许用户执行的操作的组合。那就是它。