ASP.NET Core 2.1 MVC前端如何向AzureAD认证的Web API传递Bearer令牌?
刚好碰到过几乎一模一样的场景,给你两个实用方案,一个快速搞定前端Ajax传参,一个更优雅安全的后端转发方案:
方案一:直接在Ajax请求中传递Bearer Token(快速实现)
既然你的MVC前端已经完成Azure AD登录,首先要从后端拿到当前用户的access token,再在Ajax请求里把它放到Authorization头中:
在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(); }在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头:
注册带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); } }在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
相关产品推荐
相关产品推荐

