C#代码获取Azure Runbook Job Id状态时触发401错误求助
Azure Function调用Runbook后获取Job状态报401错误的解决方案
你当前的代码能通过Webhook触发Runbook,但查询Job状态时返回401,本质是调用Azure Management API时没有携带有效的Azure AD授权令牌——托管标识的权限需要通过令牌传递给API,而你当前的HttpClient请求没有添加这个必要的认证头。
解决步骤:
添加Azure.Identity依赖
首先确保你的项目安装了Azure.IdentityNuGet包,用于获取托管标识的访问令牌:Install-Package Azure.Identity获取托管标识令牌并添加到请求头
使用ManagedIdentityCredential获取针对Azure管理API的令牌,然后在每次调用Management API时将令牌放入Authorization头中。修改后的完整代码示例
using Azure.Identity; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net.Http.Headers; using System.Text; // ... 其他代码 ... var credential = new ManagedIdentityCredential(); var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { "https://management.azure.com/.default" }); var accessToken = await credential.GetTokenAsync(tokenRequestContext); using (var client = new HttpClient()) { // 触发Runbook的部分保持不变 HttpContent inputContent = new StringContent(inputJson, Encoding.UTF8, "application/json"); var url = "<Webhook URL>"; var response = await client.PostAsync(url, inputContent); var content = await response.Content.ReadAsStringAsync(); RunBookData rData = JsonConvert.DeserializeObject<RunBookData>(content); var jobId = new Guid(rData.JobIds[0]); // 设置HttpClient的Authorization头,用于后续Management API调用 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Token); while (true) { // 查询Job状态的请求 var jobStatusUrl = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Automation/automationAccounts/{automationAccountName}/jobs/{jobId}?api-version=2015-10-31"; response = await client.GetAsync(jobStatusUrl); if (!response.IsSuccessStatusCode) { Console.WriteLine("----------------------> 获取Job状态失败 " + response.StatusCode); throw new Exception($"获取Job状态失败,状态码:{response.StatusCode}"); } content = await response.Content.ReadAsStringAsync(); var status = JObject.Parse(content)["properties"]["status"].Value<string>(); if (status is "Completed" or "Failed" or "Stopped") { Console.WriteLine("状态----------------------> " + status); break; } await Task.Delay(TimeSpan.FromSeconds(30)); } }验证角色权限配置
- 确认托管标识被分配的角色包含
Microsoft.Automation/automationAccounts/jobs/read权限,推荐使用内置角色自动化操作员或自动化参与者 - 角色分配的范围需要覆盖目标自动化账户(可以是自动化账户本身、所在资源组或订阅级别)
- 等待角色分配生效(通常需要几分钟,最长不超过30分钟)
- 确认托管标识被分配的角色包含
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

