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

Azure AD B2C-ASP.Net Core Angular应用获取下游Web API令牌报错

问题分析与解决方案

错误核心原因

你遇到的MsalUiRequiredException(错误码user_null),本质是后端控制器的HttpContext.User为空,未建立有效用户上下文,导致TokenAcquisition.GetAccessTokenForUserAsync无法找到用户信息来获取下游API的令牌。

排查与修复步骤

1. 强制控制器验证请求令牌

给你的API控制器添加[Authorize]属性,确保请求中的令牌会被验证,进而填充用户上下文:

[ApiController]
[Route("api/[controller]")]
[Authorize] // 必须添加,触发令牌验证流程
public class YourController : ControllerBase
{
    // 控制器逻辑
}

2. 检查后端认证中间件配置

在Program.cs中确认Azure AD B2C的认证配置正确,能解析前端发送的Bearer令牌:

// 配置B2C认证与下游API令牌获取
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

// 确保中间件顺序正确:先认证,再授权
app.UseAuthentication();
app.UseAuthorization();

同时确认appsettings.json中的B2C参数准确:

"AzureAdB2C": {
  "Instance": "https://你的租户.b2clogin.com/",
  "ClientId": "后端API的客户端ID",
  "Domain": "你的租户域名.onmicrosoft.com",
  "SignUpSignInPolicyId": "你的B2C登录策略ID"
}

3. 验证前端发送的令牌有效性

  • 确认Angular的MSAL拦截器发送的是针对后端API的访问令牌(而非ID令牌),且请求头Authorization格式为Bearer {token}。
  • 用JWT解析工具验证令牌的aud(受众)是否匹配后端API的ClientId,iss(签发者)是否指向你的B2C租户。

4. 先确认用户上下文已建立

在控制器方法中先检查用户认证状态,排除令牌未被解析的情况:

public async Task<IActionResult> YourAction()
{
    if (!User.Identity.IsAuthenticated)
    {
        return Unauthorized();
    }

    // 再尝试获取下游API令牌
    var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "https://你的租户.onmicrosoft.com/下游API/权限范围" });
    // 调用下游API逻辑
}

5. 排查令牌缓存配置

若用户已认证但仍报错,检查令牌缓存配置:开发环境用AddInMemoryTokenCaches可临时验证,生产环境建议改用分布式缓存(如Redis)避免缓存丢失问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:08:13