我正在尝试从 Azure Function 访问 APIM,并希望 APIM 通过托管身份 token 进行身份验证。我已将系统分配的标识分配给函数应用程序。我正在关注此(示例)[https://learn.microsoft.com/en-us/azure/app-service/overview-management-identity?tabs=dotnet#asal ] 生成 token 。在下面的行中,如果我将“https://vault.azure.net”提供给 GetAccessTokenAsync 方法,我将获得 token 。但我希望观众是 APIM,所以我提供了 https://azure-api.net就像最后一行提到的那样。但我遇到了异常(exception)。如何提供 APIM Url 来获取访问 token ?
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 ,然后您可以获得它的 token (即使用上一个链接中的Application ID URI
)。
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("<Application ID URI>");
<小时/>
你需要知道的事情:
您可以使用 azureServiceTokenProvider
获取 https://vault.azure.net
、https://managment.azure.com
的 token code>,因为都是微软公开的API,即azure keyvault rest api和 azure management rest api ,本质上都是微软注册的AD App,所以如果你想获取自己API的token,需要先注册AD App来代表API。
此外,当您使用托管身份来获取 token 时,本质上是 it uses the client credential flow要获取 token ,实际上托管身份是由azure管理的服务主体(即企业应用程序)。请记住利用 app role如果您需要在获取访问 token 时验证 roles
声明。
关于azure - 如何获取 token 以从具有托管身份的 Function App 访问 APIM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67398519/