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
。为什么?

您好,谢谢您的回答。我需要等待管理员打开该角色的应用程序权限,因为我没有访问权限。

同时,我想解释一下实际问题。

我有我的应用程序后端(api)。我已经使用 clientid、clientsecret、scope 等创建了 appregistration,现在从我的 UI(角度)能够通过传递我的 microsoft 登录名来验证 api (Swagger),并且用户已通过身份验证,这很好。我的 api swagger 如下。 招摇如下所示

但是,我几乎没有其他客户端想要调用我的 api 端点。因此,它不应该是交互式登录。因为他们运行某种作业,并且必须自动获取 api 响应,而不提示用户登录等, 所以我想,我可以使用客户端凭据来实现此目的。请让我知道是否确实需要客户凭据授予,或者我是否需要使用其他授予类型。如果有请解释一下。

谢谢你。

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.