范围和索赔(再次!)

Dav*_*vid 1 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"}配置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"和角色"read_only".

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

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

如果调用者是用户 - 然后使用角色来确定可访问性,则使用范围来确定可访问性

还是我完全被误解了?

Bro*_*len 11

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