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

