无法使用 Azure AD 和客户端凭据流请求特定范围的 OAuth2 令牌

Pet*_*rus 12 oauth token azure clientcredential

我们正在开发一个具有前端和后端的应用程序。应使用 OAuth2 令牌通过 Rest API 访问后端。授权提供商是 Azure AD。

在 Azure 中,我们创建了 2 个应用程序注册。一种用于 API,一种用于客户端应用程序。API 注册定义了 3 个范围(读、写、删除)。客户端应用程序注册已委派这些范围的权限。

我们正在从客户端应用程序注册请求带有 clientID 和 clientSecret 的令牌。

问题是我们只能请求范围为 api/.default 的令牌。例如 api/read 会导致无效范围错误。但如果我们使用 api/.default,则令牌中不包含范围 (scp) 属性。是否不需要检查使用 API 的应用程序是否具有正确的权限?

我不确定我们是否做错了什么,或者我们是否有错误的理解/期望。

Ani*_*h K 18

使用客户端凭据流获取 Azure AD JWT 令牌时,范围必须采用以下格式

api://<clientid of the API app registered>/.default
Run Code Online (Sandbox Code Playgroud)

根据 MSDN,OAUTH 客户端凭证流程

范围- 必需 - 在此请求中传递给范围参数的值应该是所需资源的资源标识符(应用程序 ID URI),并附加 .default 后缀。对于 Microsoft Graph 示例,该值为https://graph.microsoft.com/.default。此值告诉 Microsoft 标识平台,在您为应用程序配置的所有直接应用程序权限中,终结点应为与您要使用的资源关联的权限颁发令牌。要了解有关 /.default 范围的更多信息,请参阅同意文档。


小智 16

Azure AD 返回的令牌中包含的声明取决于所使用的 OAuth2 授权类型。使用客户端凭据流程时,这意味着正在使用两个应用程序,其中两个应用程序都不涉及任何用户交互。Azure 文档使用术语守护程序应用程序和 Web API 应用程序。守护程序应用程序是调用 Web API 应用程序的 API 的应用程序。

明显但不幸的是错误的方法是在 Azure 门户上使用“公开 API”:AD -> 应用程序 -> 公开 API 来创建权限。问题是“公开 API”仅创建委托权限。但委派权限仅在涉及用户时才相关。使用客户凭证授权时情况并非如此。

需要创建的是应用程序权限。目前看来,这些权限只能直接在Manifest中创建。创建应用程序权限需要以下内容:

  1. 转到 AD 中的 Web API 应用程序 -> 单击 Manifest
  2. 将 appRoles 字段更改为如下所示:
    {
       // ...
       "appRoles": [
         {
            "allowedMemberTypes": ["Application"],          // Must be "Application"
            "description": "Allows Read operation",
            "displayName": "Read",
            "id": "a35fcf6e-58c4-42af-937d-f43e90103b44",   // A unique UUID
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "Read"                                 // The role one wants to create
          }
       ]
       // ...
    }    
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保存文件

还可以在官方 Azure 文档页面受保护的 Web API:应用程序注册上找到更多信息。

现在可以转到 AD 中的守护程序应用程序并授予创建的应用程序权限。在 Azure 门户中,这是通过以下步骤完成的:

  1. 转到 AD 中的 Daemon 应用程序
  2. 转到API 权限
  3. 点击添加权限
  4. 选择我的 API
  5. 选择 Web API 应用程序
  6. 选择应用程序权限
  7. 现在选择守护程序应用程序获得的权限
  8. 点击添加权限
  9. 通过单击“授予管理员同意...”来授予管理员同意

守护程序应用程序现在可以使用客户端凭据授予来请求令牌。请求中的范围必须是“/.default”。(仅对于委派权限,可以请求非默认范围。)返回的令牌将包含声明角色,它是授予权限的列表。列表中的权限是授予Damon应用程序的权限。例如

"roles": ["Read"]
Run Code Online (Sandbox Code Playgroud)

  • 这个答案值得更多关注。用户与应用程序请求中角色与范围的区别非常重要,几乎在任何地方都没有明确描述(除了这个优秀的答案)。只是为了在 2022 年添加这一点:您可以使用服务器应用程序注册表的“应用程序角色”选项卡添加应用程序权限,该选项卡又可以与授予客户端应用程序注册表的“应用程序权限”一起使用。 (3认同)