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

ASP.NET Core 2.1 MVC前端如何向AzureAD认证的Web API传递Bearer令牌?

刚好碰到过几乎一模一样的场景,给你两个实用方案,一个快速搞定前端Ajax传参,一个更优雅安全的后端转发方案:

方案一:直接在Ajax请求中传递Bearer Token(快速实现)

既然你的MVC前端已经完成Azure AD登录,首先要从后端拿到当前用户的access token,再在Ajax请求里把它放到Authorization头中:

  1. 在MVC Controller中获取并传递token到前端
    在你要发起Ajax请求的页面对应的Action里,获取access token并通过ViewBag传给视图:

    public async Task<IActionResult> Index()
    {
        // 从当前登录上下文获取Azure AD颁发的access token
        var accessToken = await HttpContext.GetTokenAsync("access_token");
        ViewBag.AccessToken = accessToken;
        return View();
    }
    
  2. 在Ajax请求中添加Authorization头
    在视图的JavaScript代码里,直接把token拼到请求头里:

    $.ajax({
        url: "https://your-api-domain/api/your-endpoint",
        method: "GET",
        headers: {
            // 注意Bearer后面要有空格
            "Authorization": `Bearer ${@ViewBag.AccessToken}`
        },
        success: function(response) {
            // 处理返回数据
            console.log(response);
        },
        error: function(xhr) {
            // 处理未授权或其他错误
            console.error("请求失败:", xhr.statusText);
        }
    });
    

方案二:使用HttpClient封装API调用(更安全优雅)

如果不想把token暴露给前端,或者需要统一管理API调用逻辑,推荐在MVC后端用HttpClient封装请求,自动添加Authorization头:

  1. 注册带Token处理的HttpClient
    在Startup.cs的ConfigureServices方法中,注册HttpClient和自定义的Token处理Handler:

    // 先注册HttpContextAccessor,用来获取当前登录上下文
    services.AddHttpContextAccessor();
    // 注册自定义的BearerTokenHandler
    services.AddTransient<BearerTokenHandler>();
    // 注册带Handler的HttpClient
    services.AddHttpClient("MyProtectedApiClient", client =>
    {
        client.BaseAddress = new Uri("https://your-api-domain/");
    }).AddHttpMessageHandler<BearerTokenHandler>();
    
    // 自定义Handler,自动给请求添加Authorization头
    public class BearerTokenHandler : DelegatingHandler
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
    
        public BearerTokenHandler(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
            if (!string.IsNullOrEmpty(accessToken))
            {
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
            }
            return await base.SendAsync(request, cancellationToken);
        }
    }
    
  2. 在Controller中使用HttpClient调用API
    注入IHttpClientFactory,创建预配置的客户端发起请求:

    private readonly IHttpClientFactory _httpClientFactory;
    
    public HomeController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }
    
    public async Task<IActionResult> FetchApiData()
    {
        var apiClient = _httpClientFactory.CreateClient("MyProtectedApiClient");
        var response = await apiClient.GetAsync("api/your-endpoint");
        
        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            ViewBag.ApiResponse = data;
        }
        else
        {
            ViewBag.ErrorMessage = $"API请求失败:{response.StatusCode}";
        }
        
        return View();
    }
    

关键注意事项

  • 权限配置:确保在Azure Portal中,你的MVC前端应用已经被授予调用后端API的权限(找到前端应用注册→API权限→添加权限→选择你的后端API→勾选对应的权限→授予管理员同意)。
  • Token受众检查:用JWT解析工具查看access token的aud字段,必须和后端API的Client ID一致,否则后端会返回401。
  • Scope配置:登录时要请求后端API的正确scope,格式通常是api://{后端API的Client ID}/access_as_user,确保在MVC的Azure AD认证配置中指定了这个scope。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:42:43