ASP.NET三层架构集成Azure AD认证问题求助
解决Web APP通过AJAX向Web API传递Azure AD令牌的问题
我刚处理过几乎一模一样的场景,核心问题就是你的Web APP在AJAX调用API时没带上用户的Azure AD访问令牌,导致API认不出请求身份。下面是我实际项目里验证过的步骤,一步步来就能搞定:
1. 在Web APP后端获取针对API的访问令牌
首先得在你的ASP.NET MVC项目里拿到能访问Web API的令牌,用Microsoft.Identity.Web库最省心——如果是新版ASP.NET模板,这个库已经集成了;旧版本的话,先装个NuGet包Microsoft.Identity.Web就行。
在Program.cs(或者旧版的Startup.cs)里,把认证配置改成这样,加上调用下游API的能力:
// Program.cs 示例代码 builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "api://你的WebAPI应用ID/自定义访问范围" }) .AddInMemoryTokenCaches();
然后在MVC控制器里注入ITokenAcquisition服务,拿令牌传给视图:
private readonly ITokenAcquisition _tokenAcquisition; public HomeController(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async Task<IActionResult> Index() { // 这里的范围要和你在Azure门户里给WebAPI定义的一致 string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "api://你的WebAPI应用ID/自定义访问范围" }); // 把令牌放到ViewBag里,让前端能拿到 ViewBag.ApiToken = accessToken; return View(); }
2. 前端AJAX请求带上令牌
在你的MVC视图(比如Index.cshtml)里,把后端传过来的令牌加到AJAX的请求头里,用Bearer认证格式:
$(document).ready(function() { // 从ViewBag取令牌,注意这里的Razor语法要正确解析 const apiToken = '@ViewBag.ApiToken'; // 调用Web API的AJAX示例 $.ajax({ url: 'https://你的WebAPI域名/api/你的数据接口', method: 'GET', headers: { // 关键:把令牌放到Authorization头里 'Authorization': `Bearer ${apiToken}` }, success: function(response) { // 拿到数据后随便怎么渲染都行 console.log('API返回数据:', response); $('#data-display').text(JSON.stringify(response)); }, error: function(xhr) { if (xhr.status === 401) { // 令牌过期了,跳回登录页重新拿 window.location.href = '/Account/SignIn'; } else { alert('加载数据失败,请稍后重试'); console.error('API调用错误:', xhr.responseText); } } }); });
3. 确认Web API的Azure AD配置正确
别漏了在Azure门户里给Web API开权限,让Web APP能访问它:
- 找到你的Web API应用注册,进入「公开API」页面,确认你用的访问范围已经创建好了
- 进入「API权限」页面,添加Web APP的应用权限(或者确保Web APP已经被授权访问这个范围)
- 另外Web API的代码里,认证中间件要配置对:
// Web API的Program.cs示例 builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);
4. 额外的小细节
- 令牌有有效期,所以前端一定要处理401错误,跳回登录页重新获取
- 别在前端硬编码任何敏感信息,令牌必须从后端传过来
- 确保Web APP和Web API在同一个Azure AD租户里,跨租户的话还要额外配置信任关系
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

