You need to enable JavaScript to run this app. 配置Azure AD认证的API不接受MSAL获取的访问令牌
优惠活动
大模型
产品
解决方案
定价
更多

配置Azure AD认证的API不接受MSAL获取的访问令牌

令牌校验失败排查路径与落地方案

高频问题点定位(全部对应当前代码可复现的错误)

  • MSAL配置硬语法与参数错误
    • 原msalConfig.auth块末尾存在孤立无意义的双引号,会直接导致配置解析异常
    • 配置键拼写错误:cache错写为cashe、cacheLocation错写为casheLocation、storeAuthStateInCookie错写为storeAuthStateInCookkie,错误键值会被MSAL直接忽略,导致缓存逻辑失效,拿到的令牌不是目标范围的有效令牌
    • auth节点下额外定义的tenantId为无效配置,MSAL不会读取该字段,属于冗余配置
    • 核心参数名错误:loginRequest中传入的是单数scope,但MSAL的令牌获取接口要求参数名为复数scopes,参数识别失败后,静默获取令牌时根本不会申请自定义API的权限,只会默认申请openid/profile等基础权限,拿到的令牌受众自然不匹配API
  • 后端Audience配置与令牌实际值不匹配
    原后端配置将Audience设为裸的Azure AD ClientId,但当API在Azure AD应用注册中暴露自定义API权限(如api://<ClientId>/Read)时,签发的访问令牌aud声明值为自定义的App ID URI(格式为api://<ClientId>),和裸ClientId字符串不相等,直接触发校验失败
  • 应用注册权限链路未打通
    需确认两个核心配置:
    • 后端API的应用注册「公开API」板块,已暴露Read权限,权限完整标识符与前端申请的api://<ClientId>/Read完全一致
    • 前端SPA的应用注册「API权限」板块,已添加上述API暴露的Read权限,且已完成租户级别的管理员同意授权;否则静默获取令牌时会因权限未授权,返回默认的Microsoft Graph令牌
  • Authority端点格式不兼容
    配置中使用的https://sts.windows.net/<TenantId>为旧版v1.0端点格式,MSAL默认获取的是v2.0版本的访问令牌,端点元数据不匹配会导致令牌 issuer 校验失败

修正后的正确配置示例

后端JwtBearer配置

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 替换为API在Azure AD中暴露的实际App ID URI,和令牌aud声明完全一致
        options.Audience = Configuration["AzureAd:AppIdUri"];
        // 使用标准v2.0端点格式
        options.Authority = $"{Configuration["AzureAd:Instance"]}/{Configuration["AzureAd:TenantId"]}/v2.0";
        // 可选:开启失败日志方便定位
        options.Events = new JwtBearerEvents
        {
            OnAuthenticationFailed = context =>
            {
                Console.WriteLine($"令牌校验失败原因: {context.Exception.Message}");
                return Task.CompletedTask;
            }
        };
    });

前端MSAL配置

export const msalConfig = {
    auth: {
        clientId: "你的SPA应用注册ClientId",
        // 替换为标准v2.0 authority格式
        authority: "https://login.microsoftonline.com/你的租户ID",
        redirectUri: "http://localhost:3000/"
    },
    cache: {
        cacheLocation: "sessionStorage",
        storeAuthStateInCookie: false
    }
}

// 修正参数名为复数scopes
export const loginRequest = {
    scopes: ['api://你的API应用ClientId/Read']
}

实操验证步骤

  1. 拿到前端静默获取的访问令牌,解码后核对两个核心声明:
    • aud:值需与后端配置的Audience完全一致
    • scp:值需包含申请的Read权限
  2. 若解码后aud为https://graph.microsoft.com,说明申请目标API令牌失败,需重新检查权限配置、scopes参数名、管理员同意状态
  3. 清空浏览器sessionStorage中的旧MSAL缓存,重新走登录流程获取新令牌后再测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 20:27:07