1

我正在尝试从 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 运行时我可以看到订阅在同一个租户下。

4

1 回答 1

0

正如我在评论中提到的,您需要在 Azure AD 中注册一个应用程序来表示 API,然后您可以获得它的令牌(即使用上Application ID URI一个链接中的)。

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

你需要知道的一些事情:

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

此外,当您使用托管标识获取令牌时,本质上它使用客户端凭据流来获取令牌,实际上托管标识是由azure管理的服务主体(即企业应用程序)。如果您需要在获取访问令牌时验证声明,请记住利用应用角色。roles

于 2021-05-07T02:30:47.303 回答