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

.NET API需支持应用与React授权,React端令牌验证失败求助

解决React调用.NET API返回401(签名无效)的问题

核心原因

你这问题本质是两种认证流的令牌不兼容:

  • EXE用的client_credentials是服务对服务的凭证,令牌受众(aud)直接指向API,API认服务主体的签名。
  • React是用户登录的授权流,令牌是用户委托的,得确保API认这个令牌的受众、权限,同时你MSAL的调用参数也得对。

一步步修复

1. 修正React端的令牌获取代码

你现在的acquireTokenSilent调用参数错误,必须指定API的权限范围,同时注意拼写错误(activeAccout → activeAccount):

import {publicClientApplication} from "../../components/Auth/Microsoft";

// 登录流程保持不变
const data = await publicClientApplication.loginPopup();
publicClientApplication.setActiveAccount(data.account);

// 获取令牌必须传入API的权限范围,不能只传账号
const activeAccount = publicClientApplication.getActiveAccount();
const tokenResponse = await publicClientApplication.acquireTokenSilent({
  account: activeAccount,
  // 替换成你的API的权限范围,格式为 api://{API客户端ID}/{权限名}
  // 示例:api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx/access_as_user
  scopes: ["api://<你的API客户端ID>/access_as_user"]
});

const endpointData = await api().get(
  '/endpoint',
  { headers: {'Authorization': `Bearer ${tokenResponse.accessToken}`} }
);

2. 检查Azure AD配置

  • 针对API注册:
    1. 进入公开API页面,添加一个用户可访问的权限(比如命名为access_as_user),将状态设为“已启用”,记录该权限的完整字符串(即上述代码中的scope值)。
  • 针对React应用注册:
    1. 进入API权限页面,添加刚才API注册的access_as_user权限(选择“我的API”分类),点击授予管理员同意(租户内应用必须完成此步骤)。

3. 确认.NET API的认证配置

检查appsettings.json中的AzureAd配置,确保填写的是API自身的客户端ID,而非React应用的:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "<你的租户ID>",
  "ClientId": "<你的API客户端ID>" // 此处为API的ID,不是React应用的ID
}

若需同时支持两种认证流,可显式配置验证参数确保兼容:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(options =>
        {
            Configuration.Bind("AzureAd", options);
            // 允许v2.0格式的令牌(React使用MSAL v2,令牌为v2格式)
            options.TokenValidationParameters.ValidIssuer = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/v2.0";
            // 确保受众匹配API的客户端ID
            options.TokenValidationParameters.ValidAudience = Configuration["AzureAd:ClientId"];
        },
        options => { Configuration.Bind("AzureAd", options); });
    ...
}

4. 调试令牌内容

将React获取的令牌复制到JWT解析工具中,检查以下关键字段:

  • aud:必须等于你的API客户端ID(格式可能为api://<ID>或直接是ID字符串)。
  • iss:应为https://login.microsoftonline.com/<租户ID>/v2.0。
  • scp:需包含你设置的access_as_user权限。
    若这些字段不符合预期,说明要么scope参数传递错误,要么Azure AD配置存在问题。

内容的提问来源于stack exchange,提问作者Matthew Mc Allister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:50:27