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

Azure API Management无效访问令牌问题排查求助

解决Azure API Management ARM API调用的InvalidAuthenticationToken错误

你这里的核心问题是混淆了两种不同API的认证机制,这直接导致了令牌无效的报错:

关键误区:API类型与认证方式不匹配

你当前调用的是Azure Resource Manager (ARM) 体系下的APIM管理API(地址以management.azure.com开头),但你生成的是APIM自身管理API(地址格式为{apim-service-name}.management.azure-api.net)专用的SharedAccessSignature令牌,这两种API的认证体系完全不同:

  • APIM自身的管理API:使用基于密钥的SAS签名(你现在生成的这种)
  • ARM体系下的APIM API:必须使用Azure Active Directory (AAD) 颁发的Bearer令牌

解决方案:改用Azure AD令牌认证

要调用management.azure.com下的APIM报表API,你需要获取AAD的访问令牌,推荐使用Azure官方的Azure.Identity库来简化令牌获取流程,以下是修正后的实现:

1. 安装必要的NuGet包

Install-Package Azure.Identity

2. 修正后的代码(使用async/await避免死锁)

using Azure.Identity;
using System.Net.Http.Headers;

public async Task<string> GetAnalyticsAsync()
{
    string data = string.Empty;
    // 修正URL中的多余斜杠:reports//byApi → reports/byApi
    var armApiUrl = "https://management.azure.com/subscriptions/{subscriptionID}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/reports/byApi?$filter=timestamp ge datetime'2019-08-01T00:00:00' and timestamp le datetime'2019-08-09T00:00:00'&api-version=2019-01-01";

    // 使用服务主体获取AAD令牌(需提前在AAD注册应用并授予APIM管理权限)
    var credential = new ClientSecretCredential(
        tenantId: "{你的租户ID}",
        clientId: "{服务主体的Client ID}",
        clientSecret: "{服务主体的Client Secret}"
    );

    // 请求ARM API的访问令牌
    var tokenRequestContext = new TokenRequestContext(new[] { "https://management.azure.com/.default" });
    var tokenResult = await credential.GetTokenAsync(tokenRequestContext);

    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.Token);
        var response = await client.GetAsync(armApiUrl);
        response.EnsureSuccessStatusCode(); // 主动抛出HTTP错误,便于调试
        data = await response.Content.ReadAsStringAsync();
    }
    return data;
}

3. 必要的配置说明

  • 服务主体权限:你需要在AAD中注册一个服务主体,并给它分配对目标APIM实例的API Management Service Contributor(或更细粒度的)角色,确保它有权限读取报表数据
  • 参数替换:把代码中的占位符({subscriptionID}、{resourceGroupName}等)替换为你实际的Azure资源信息和服务主体凭据

额外注意事项

  • 避免使用.Result同步等待异步操作,这很容易导致死锁,改用async/await模式是更安全的做法
  • 原URL中的reports//byApi存在多余斜杠,建议修正为reports/byApi,避免潜在的URL解析问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:57:22