如何获取令牌以从具有托管标识的功能应用程序访问 APIM

时间:2021-05-05 09:22:54

标签: azure azure-api-management azure-managed-identity

我正在尝试从 Azure Function 访问 APIM,并希望 APIM 通过托管标识令牌进行身份验证。我已将系统分配的标识分配给功能应用程序。我正在关注此(示例)[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 时我可以看到订阅在同一个租户下。

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您需要Register an application in Azure AD to represent the API,然后您才能为其获取令牌(即使用上一个链接中的 Application ID URI)。

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

你需要知道的事情:

可以使用azureServiceTokenProvider获取https://vault.azure.nethttps://managment.azure.com的token,因为都是微软公开的API,即azure keyvault rest apiazure management rest api ,本质上都是微软注册的AD App,所以如果想获取自己API的token,需要先注册AD App,先代表API。

另外,当您使用托管身份获取令牌时,本质上是it uses the client credential flow 获取令牌,实际上托管身份是由azure 管理的服务主体(即企业应用程序)。如果您需要在获取访问令牌时验证 roles 声明,请记住利用 app role