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

Azure App Service托管WebAPI调用Application Insights遇无效令牌凭据问题

问题分析与解决方案

你遇到的invalid token credentials错误,核心原因是用错了查询方法——QueryWorkspaceAsync是针对Log Analytics工作区的API,而你要查询的是Application Insights资源,应该使用QueryResourceAsync方法。以下是修正后的实现步骤和代码:

1. 修正核心API调用方法

将QueryWorkspaceAsync替换为QueryResourceAsync,这个方法专门用于查询Application Insights(或其他Azure监控资源)的日志数据。

2. 确认权限配置

确保你的托管标识已被授予以下任一权限(范围需覆盖目标Application Insights资源):

  • Application Insights Component Reader:针对AI资源的只读权限
  • Log Analytics Reader:如果你的AI数据关联了Log Analytics工作区,这个权限也能生效

3. 修正后的完整代码

using Azure;
using Azure.Identity;
using Azure.Monitor.Query;
using Azure.Monitor.Query.Models;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class LogsController : ControllerBase
{
    [HttpGet("recent-traces")]
    public async Task<IActionResult> GetRecentTraces()
    {
        // 系统分配托管标识:直接使用DefaultAzureCredential
        // 用户分配托管标识:指定ManagedIdentityClientId
        var credential = new DefaultAzureCredential(
            new DefaultAzureCredentialOptions
            {
                // 若使用用户分配的托管标识,取消注释并填入ClientID
                // ManagedIdentityClientId = "你的托管标识ClientID"
            });

        var client = new LogsQueryClient(credential);

        // 替换为你的Application Insights资源ID
        string appInsightsResourceId = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/microsoft.insights/components/{applicationInsightsName}";
        
        // KQL查询:获取最近10条trace
        string kqlQuery = "traces | order by timestamp desc | take 10";

        try
        {
            // 使用QueryResourceAsync替代QueryWorkspaceAsync
            Response<LogsQueryResult> queryResponse = await client.QueryResourceAsync(
                appInsightsResourceId,
                kqlQuery,
                new QueryTimeRange(TimeSpan.FromHours(1)));

            // 解析查询结果
            var traces = new List<Dictionary<string, object>>();
            foreach (var row in queryResponse.Value.Table.Rows)
            {
                var trace = new Dictionary<string, object>();
                for (int i = 0; i < queryResponse.Value.Table.Columns.Count; i++)
                {
                    trace[queryResponse.Value.Table.Columns[i].Name] = row[i];
                }
                traces.Add(trace);
            }

            return Ok(traces);
        }
        catch (RequestFailedException ex)
        {
            // 捕获并返回Azure API的错误信息
            return StatusCode((int)ex.Status, $"查询失败: {ex.Message}");
        }
    }
}

4. 额外排查点

  • 确认资源ID拼写完全正确,包括订阅ID、资源组名、AI组件名
  • 若使用用户分配的托管标识,确保App Service的身份配置中已启用该标识
  • 检查Azure AD令牌的权限:DefaultAzureCredential会自动请求https://api.loganalytics.io/.default范围的令牌,确保托管标识有权限获取该令牌

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:15:02