如何通过代码解决Azure Management API未授权错误以获取函数名
解决Azure Management API未授权问题(代码实现)
问题根源
调用Azure管理API必须携带Azure AD颁发的Bearer令牌,你的请求因为缺少这个令牌返回未授权。下面用代码实现令牌获取与API调用的完整流程,无需命令行操作。
步骤1:安装依赖NuGet包
先安装官方身份验证库和HTTP辅助包:
Install-Package Azure.Identity Install-Package System.Net.Http.Json
步骤2:修改代码实现身份验证与API调用
根据运行环境选择对应的实现:
场景1:Azure环境中运行(用托管身份)
如果你的Pulumi程序在Azure Function、VM等Azure服务中运行,且已启用托管身份,代码可自动获取令牌:
using Azure.Identity; using System.Net.Http.Headers; var current = Pulumi.Azure.Core.GetClientConfig.InvokeAsync().Result; var subscriptionId = current.SubscriptionId; var appName = functionApp.Name; // 注意:URL不要加前缀"GET ",HttpClient会自动处理请求方法 var url = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{appName}/functions?api-version=2022-03-01"; // DefaultAzureCredential自动适配托管身份、环境变量等多种身份源 var credential = new DefaultAzureCredential(); var tokenContext = new Azure.Core.TokenRequestContext(new[] { "https://management.azure.com/.default" }); var accessToken = await credential.GetTokenAsync(tokenContext); // 给请求添加Authorization头 var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Token); var result = await httpClient.GetAsync(url); if (!result.IsSuccessStatusCode) { var errorDetails = await result.Content.ReadAsStringAsync(); throw new Exception($"获取函数名称失败:状态码{(int)result.StatusCode},详情:{errorDetails}"); } // 解析返回的JSON数据 var jsonContent = await result.Content.ReadAsStringAsync(); // 此处可根据需要反序列化为对象,提取函数名称列表
场景2:本地/非Azure环境运行(用服务主体)
本地运行时,先配置三个环境变量:
AZURE_CLIENT_ID:服务主体的应用IDAZURE_CLIENT_SECRET:服务主体的密钥AZURE_TENANT_ID:Azure AD租户ID
代码和场景1完全一致,DefaultAzureCredential会自动读取这些环境变量生成令牌,无需额外修改。
步骤3:给身份分配权限
不管用托管身份还是服务主体,必须给该身份分配读者角色(或更细粒度的权限)到目标Function App所在的资源组/订阅:
- 登录Azure门户,找到目标资源组/订阅
- 进入「访问控制(IAM)」→「添加角色分配」
- 选择「读者」角色,搜索并选中你的身份,完成分配
关键注意点
- 不要在URL前加
GET,这会导致请求地址无效 DefaultAzureCredential支持多身份源,适配本地、Azure等多种运行环境- 如需最小权限,可自定义RBAC角色,仅授予
Microsoft.Web/sites/functions/read权限
内容的提问来源于stack exchange,提问作者Scott Nimrod
相关产品推荐
相关产品推荐

