范围未添加到从 Azure Ad 返回的访问令牌

Bry*_*eBy 2 azure azure-active-directory

概述

我们有一个 Azure AD 安全 API 作为 Web 应用程序存在于 Azure 中。我们需要能够:

  1. 通过客户端应用程序的用户交互触发此 API(此部分有效)。
  2. 从计划的作业中以编程方式触发此 API,该作业将简单地获取令牌并点击此 API(由于身份验证问题,此部分不起作用)。

问题

问题是,当我们从 Azure AD 请求令牌时,令牌声明中未设置范围,导致 API 拒绝令牌。

这是我们提出的要求: 在此输入图像描述

此请求返回带有以下声明的访问令牌:

{
  "aud": "<our api client id>",
  "iss": "https://login.microsoftonline.com/<tenantId>/v2.0",
  "iat": 1644421512,
  "nbf": 1644421512,
  "exp": 1644425412,
  "aio": "<value>",
  "azp": "<scheduled job client id>",
  "azpacr": "1",
  "oid": "<guid>",
  "rh": "<value>",
  "sub": "<guid>",
  "tid": "<guid>",
  "uti": "<value>",
  "ver": "2.0"
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,scp即使我们将(范围)包含在请求中,令牌声明中也不包含它。

如果我们使用此令牌向 API 发出请求,我们会收到以下错误:

System.UnauthorizedAccessException: IDW10201: Neither scope or roles claim was found in the bearer token.
Run Code Online (Sandbox Code Playgroud)

如果我们能提供有关如何从 Azure AD 获取访问令牌以及调用我们的 API 的适当范围/权限的任何帮助,我们将不胜感激。

笔记

我们计划作业的 Azure AD 应用程序注册将请求令牌,然后访问我们的 API,确实具有委派 API 权限access_as_user,您可以看到我将其包含在令牌请求的范围中。

Ans*_*-MT 8

上述内容是预期的,因为使用客户端凭据您无法获得委派权限,access_as_user即客户端凭据中的权限和范围应用作api://<APP_ID>/.default. 因此,如果您想要委派权限,那么您将必须使用隐式授予流程而不是客户端凭据。

为了测试,我创建了两个应用程序注册,一个用于公开 API(Postman),另一个用于身份验证(Powershelltest),然后,我在 2 个不同的场景中测试了相同的内容,例如一个用于客户端凭据,另一个用于隐式授予:

主要APP已暴露API:

在此输入图像描述 在此输入图像描述

用于身份验证的应用程序:

在此输入图像描述

在此输入图像描述

场景 1 使用客户端凭证流程:

在此输入图像描述

在此输入图像描述

使用隐式授予流程的场景 2:

在此输入图像描述

在此输入图像描述