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
相关产品推荐
相关产品推荐

