Azure AD 客户端凭据生成的令牌没有声明

问题描述 投票:0回答:1

我有一个应用程序注册,其中

test.user
是我的范围。在 API 权限中,我已委派了
test.user
范围的权限。

在邮递员中,我尝试过这样的:

Grant_type   : client_credentials
Clienid      : my appid
scope        : api:\\.....id\.default
Client_secret: secret

我能够获得访问令牌。但是,如果我将此令牌作为授权持有者传递,我的应用程序始终将用户身份验证视为错误,没有任何声明。请帮忙为什么没有索赔。

此外,如果我不添加 .default 并简单地将范围值添加为

api//myid/test.user
,则会抛出错误,因为您必须使用
.default
。为什么?

但在我的 Azure 门户应用程序注册中,我已将范围定义为 API url,后跟

test.user

c# azure postman registration identity-management
1个回答
0
投票

注意:客户端凭证流使用其客户端 ID 和客户端密钥到授权服务器并执行身份验证。

  • 客户端凭证流是非用户交互流。
  • 仅支持应用程序类型API权限。
  • 用户交互流程支持委派API权限。

在您的场景中,

test.user
范围是 API 权限的委托类型,因此访问令牌将不包含值为 test.user
scp
声明。

  • 使用客户端凭证流时,必须使用后缀
    /.default
    及其默认值,并且不能直接传递范围名称。
  • 并且用户身份验证为 false,因为客户端凭证流不是用户交互流。

因此,在使用客户端凭证流时,您必须公开 API 并创建应用程序角色

enter image description here

现在应用程序角色将是应用程序类型 API 权限:

enter image description here

生成代币:

GET https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

Grant_type   : client_credentials
Clienid      : ClientID
scope        : api://ClientID/.default
Client_secret: ClientSecret

enter image description here

解码后,角色声明出现在访问令牌中:

enter image description here

  • 在使用客户端凭据流时,您无法配置自定义声明或动态自定义声明。只能使用
    displayname
    objectid
    tags
    。请参考我的这个SO Thread。 - 如果您想使用委托API权限,则切换到任何用户交互流程,用户交互流程支持所有类型的自定义声明。
  • 请参阅我的 SO Thread,了解用户交互流程和自定义声明。
© www.soinside.com 2019 - 2024. All rights reserved.