如何使用另一个应用程序服务中的MSI调用受AAD保护的应用程序服务Web API

时间:2019-02-21 06:08:22

标签: azure-active-directory azure-msi

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

现在,我们还有另一个应用程序服务,该服务将在Web API之上调用,并且将在Web API上启用AAD身份验证。

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

1 个答案:

答案 0 :(得分:0)

是的,可以,您可以参考我关于该主题的文章: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是角色/应用权限的ID。 ResourceId是API服务主体的ID。

执行完此操作后,您可以使用API​​的托管身份获取令牌,并且令牌将包含应用程序权限为"roles": "Things.Read.All"