You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#代码获取Azure Runbook Job Id状态时触发401错误求助

Azure Function调用Runbook后获取Job状态报401错误的解决方案

你当前的代码能通过Webhook触发Runbook,但查询Job状态时返回401,本质是调用Azure Management API时没有携带有效的Azure AD授权令牌——托管标识的权限需要通过令牌传递给API,而你当前的HttpClient请求没有添加这个必要的认证头。

解决步骤:

  1. 添加Azure.Identity依赖
    首先确保你的项目安装了Azure.Identity NuGet包,用于获取托管标识的访问令牌:

    Install-Package Azure.Identity
    
  2. 获取托管标识令牌并添加到请求头
    使用ManagedIdentityCredential获取针对Azure管理API的令牌,然后在每次调用Management API时将令牌放入Authorization头中。

  3. 修改后的完整代码示例

    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));
        }
    }
    
  4. 验证角色权限配置

    • 确认托管标识被分配的角色包含Microsoft.Automation/automationAccounts/jobs/read权限,推荐使用内置角色自动化操作员或自动化参与者
    • 角色分配的范围需要覆盖目标自动化账户(可以是自动化账户本身、所在资源组或订阅级别)
    • 等待角色分配生效(通常需要几分钟,最长不超过30分钟)

内容的提问来源于stack exchange,提问作者Piyush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:07:34