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

.NET 5控制台应用从AAD获取Bearer令牌调用Azure安全Web API

.NET 5 控制台应用获取AAD Bearer Token实现方案

前提确认

你需要提前准备好以下Azure AD注册信息:

  • 控制台应用注册的客户端ID(Client ID)
  • 控制台应用注册的客户端密钥(Client Secret)
  • 所属AAD的租户ID(Tenant ID)
  • 目标Web API的应用ID URI(如api://xxxx-xxxx-xxxx-xxxx)

实现步骤

1. 安装依赖NuGet包

使用包管理器控制台执行安装命令:
Install-Package Microsoft.Identity.Client -Version 4.56.0
该版本稳定兼容.NET 5运行环境。

2. 编写获取Bearer Token的核心逻辑

采用OAuth 2.0客户端凭证流获取Token,示例代码如下:

using Microsoft.Identity.Client;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace AADApiCallDemo
{
    class Program
    {
        // 替换为你自己的配置值
        private const string TenantId = "你的AAD租户ID";
        private const string ClientId = "控制台应用的客户端ID";
        private const string ClientSecret = "控制台应用的客户端密钥";
        private const string WebApiAppIdUri = "目标Web API的应用ID URI";
        // 客户端凭证流的Scope固定为 应用ID URI/.default
        private static readonly string[] Scopes = { $"{WebApiAppIdUri}/.default" };

        static async Task Main(string[] args)
        {
            // 构建机密客户端应用实例
            var app = ConfidentialClientApplicationBuilder
                .Create(ClientId)
                .WithClientSecret(ClientSecret)
                .WithAuthority($"https://login.microsoftonline.com/{TenantId}")
                .Build();

            // 获取访问Token
            AuthenticationResult result;
            try
            {
                result = await app.AcquireTokenForClient(Scopes).ExecuteAsync();
                Console.WriteLine($"获取Token成功:{result.AccessToken}");
            }
            catch (MsalServiceException ex)
            {
                Console.WriteLine($"获取Token失败:{ex.Message}");
                return;
            }

            // 调用目标Web API
            await CallWebApiAsync(result.AccessToken);
        }

        private static async Task CallWebApiAsync(string accessToken)
        {
            using var httpClient = new HttpClient();
            // 请求头添加Authorization字段
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            
            // 替换为你的Web API实际接口地址
            var apiResponse = await httpClient.GetAsync("https://你的WebAPI地址/接口路径");
            if (apiResponse.IsSuccessStatusCode)
            {
                var responseContent = await apiResponse.Content.ReadAsStringAsync();
                Console.WriteLine($"接口调用成功,返回内容:{responseContent}");
            }
            else
            {
                Console.WriteLine($"接口调用失败,状态码:{apiResponse.StatusCode},错误信息:{await apiResponse.Content.ReadAsStringAsync()}");
            }
        }
    }
}

3. 配置校验说明

  • Scope必须使用{Web API应用ID URI}/.default格式,不可自定义其他值,客户端凭证流仅支持该格式的Scope
  • 必须确保控制台应用注册时授予的是应用权限而非委托权限,且权限已由AAD管理员完成同意授权
  • 如果你的Web API部署在Azure中国区,Authority地址需要替换为https://login.chinacloudapi.cn/{TenantId}

常见异常排查

  • 401 Unauthorized获取Token失败:检查租户ID、客户端ID、客户端密钥是否填写错误,Authority地址是否匹配你使用的Azure云环境
  • 403 Forbidden调用API失败:先解码Token检查roles声明中是否包含你申请的API权限,再确认Web API侧的权限校验逻辑是否匹配对应权限值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:04