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

使用MSAL时.NET Core API遇401无效令牌错误求助

解决MSAL令牌调用.NET Core API时的401(无效签名)问题

我之前从ADAL切换到MSAL时也碰到过一模一样的问题,核心原因是MSAL和ADAL生成的令牌在受众(Audience)、颁发者(Issuer)以及令牌版本上存在差异,导致.NET Core的认证配置无法正确验证MSAL令牌。下面是一步步的排查和解决方法:

1. 确保MSAL请求的是API的正确范围

MSAL使用scopes参数而非ADAL的resource参数来指定令牌的目标资源。如果你的API是Azure AD注册的应用,需要请求api://{你的API ClientId}/.default这个范围(.default表示使用应用级权限)。

修改你的React代码中的authParams:

const authParams = {
  scopes: ["api://YOUR_API_CLIENT_ID/.default"] // 替换为实际的API ClientId
};

authProvider.getAuthProvider().UserAgentApplication.acquireTokenSilent(authParams)
 .then((res) => {
  let token = res.accessToken;
  axios.get('Employees/getCurrentEmployee', {
    headers: { 'Authorization': 'Bearer ' + token }
  })
  .then(response => { console.log('emp', response.data); });
 });

2. 调整.NET Core的JWT认证配置适配MSAL令牌

如果你的MSAL应用使用的是Azure AD v2.0端点(支持个人微软账户+工作/学校账户),令牌的颁发者会包含/v2.0后缀,且受众格式可能为api://{ClientId}而非纯ClientId字符串。你需要更新配置:

方式一:手动配置JwtBearer

services
 .AddAuthentication(sharedOptions => {
   sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
 })
 .AddJwtBearer(options => {
   // 确保Audience和令牌中的`aud`字段完全匹配(可以用jwt.ms解码令牌查看)
   options.Audience = "api://YOUR_API_CLIENT_ID"; 
   // 添加/v2.0后缀以匹配MSAL令牌的颁发者
   options.Authority = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}/v2.0";
   
   options.TokenValidationParameters = new TokenValidationParameters
   {
     ValidateIssuer = true,
     ValidIssuer = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}/v2.0",
     // v2.0令牌的NameClaimType是"name",而非ADAL的旧格式
     NameClaimType = "name",
     RoleClaimType = "roles"
   };
 });

方式二:使用Microsoft.Identity.Web(推荐)

微软官方推荐使用Microsoft.Identity.Web包来处理MSAL令牌的验证,它会自动适配v1/v2令牌的差异,减少手动配置的错误。

  1. 先安装NuGet包:Microsoft.Identity.Web
  2. 修改Startup配置:
// 替换原有的AddAuthentication+AddJwtBearer
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");
  1. 更新appsettings.json中的AzureAd配置(确保Audience匹配令牌的aud):
"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "你的租户ID",
  "ClientId": "你的API ClientId",
  "Audience": "api://你的API ClientId"
}

3. 验证令牌的核心字段

用jwt.ms解码你的MSAL令牌,重点检查:

  • aud:必须和.NET Core配置中的Audience完全一致
  • iss:必须和配置中的Authority完全一致(比如https://login.microsoftonline.com/{租户ID}/v2.0)
  • scp或roles:确认包含API的权限范围

4. 检查Azure AD应用注册的权限配置

  • 在API的应用注册中,进入「公开API」,确保已添加/.default范围
  • 在React应用的注册中,进入「API权限」,确认已添加API的/.default权限并完成管理员同意(如果是应用级权限)

完成以上步骤后,重新获取令牌调用API,应该就能解决401无效签名的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:58:17