如何使用托管身份从 Function App 获取令牌以访问 APIM

How to Fetch Token to access APIM from Function App with Managed identity

我正在尝试从 Azure Function 访问 APIM 并希望 APIM 通过托管身份令牌进行身份验证。我已将系统分配的标识分配给函数 app.I,我正在按照此(示例)[https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet#asal] 生成令牌。在下面的行中,如果我将“https://vault.azure.net”提供给 GetAccessTokenAsync 方法,我将获得令牌。但我希望观众成为 APIM,所以我提供了 https://azure-api.net,就像最后一行提到的那样。但我越来越例外。我如何提供 APIM Url 来获取访问令牌?

using Microsoft.Azure.Services.AppAuthentication;
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");

string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://azure-api.net");

一个更新。我认为列出资源有问题。因为当我给出正确的资源名称时,它说租户中不存在资源,尽管当我通过 az cli 运行 时我可以看到订阅在同一个租户下。

正如我在评论中提到的,您需要Register an application in Azure AD to represent the API,然后您可以获得它的令牌(即前面link中的Application ID URI)。

string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("<Application ID URI>");

你需要知道的事情:

可以使用azureServiceTokenProvider获取https://vault.azure.nethttps://managment.azure.com的token,因为它们都是微软公开的API,即azure keyvault rest api and azure management rest api,本质上都是微软注册的AD App,所以如果你想获得属于自己API的token,需要先注册AD App,才能代表API优先[=19] =]

此外,当您使用托管身份获取令牌时,本质上是 it uses the client credential flow to get the token, actually the managed identity is a service principal(i.e. enterprise application) managed by azure. Remember to leverage the app role 如果您需要在获取访问令牌时验证 roles 声明。