如何使用来自另一个应用服务的 MSI 调用受 AAD 保护的应用服务 Web API

how to call AAD protected app service Web API using MSI from another app service

我们有一个 Asp.net 核心 Web API 部署为 Azure 应用服务。我们在此应用程序服务 Web API 上启用了 MSI 以轻松检索 Keyvalut 机密。

现在我们有另一个应用程序服务将在网络上调用 API,我们将在网络上启用 AAD 身份验证 API。

我知道我们可以注册 AAD 应用程序以允许第二个应用服务访问 Web API,但我想知道我们是否可以在第二个应用服务上启用 MSI 并使用 MSI 获取访问权限网络令牌 api? 有什么文件可以参考吗?

可以,可以参考我的文章:https://joonasw.net/view/calling-your-apis-with-aad-msi-using-app-permissions.

您必须在 API 中定义应用权限,然后通过 PowerShell 或 Graph API 之一将这些权限分配给 MSI 服务主体。

AAD 中 API 的应用程序清单中的示例应用程序权限:

{
  "appRoles": [
    {
      "allowedMemberTypes": [
        "Application"
      ],
      "displayName": "Read all things",
      "id": "32028ccd-3212-4f39-3212-beabd6787d81",
      "isEnabled": true,
      "description": "Allow the application to read all things as itself.",
      "value": "Things.Read.All"
    }
  ]
}

此处有关权限的更多信息:https://joonasw.net/view/defining-permissions-and-roles-in-aad

然后您可以通过 AAD PowerShell 将其分配给服务主体:

Connect-AzureAD
New-AzureADServiceAppRoleAssignment -ObjectId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -Id 32028ccd-3212-4f39-3212-beabd6787d81 -PrincipalId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -ResourceId c3ccaf5a-47d6-4f11-9925-45ec0d833dec

ObjectId 和 PrincipalId 都是 MSI 生成的服务主体的 ID。 id 是 role/app 权限的id。 ResourceId 是 API 服务主体的 ID。

执行此操作后,您可以使用 API 的托管标识获取令牌,令牌将包含应用程序权限 "roles": "Things.Read.All"