.NET 6 Web API添加[Authorize]后返回401错误原因排查求助
React调用.NET 6 Web API时Azure AD令牌无效导致401的解决方法
核心问题:令牌作用域配置错误
你当前使用的作用域${process.env.REACT_APP_CLIENT_ID}/.default是针对React应用自身的,生成的令牌无法被你的Web API验证通过,具体原因如下:
- 受众不匹配:用React应用Client ID生成的令牌,
aud(受众)字段是React应用的标识,而Web API验证时期望受众是它自己的Client ID或应用ID URI,直接判定令牌无效。 - 权限范围不符:Web API需要的是
access_as_user权限,但你的作用域没有指定这个Web API的权限,令牌中不会包含对应的scp权限字段,导致权限验证失败。
具体修复步骤
获取Web API的应用ID URI
登录Azure门户,找到你的Web API应用注册,在"概述"页面复制应用ID URI(通常格式为api://{WebAPI_Client_ID})。修正React代码中的作用域
把作用域替换为Web API的应用ID URI加上对应的权限名:let scopes: string[] = ["api://{WebAPI_Client_ID}/access_as_user"];注意替换
{WebAPI_Client_ID}为你Web API的实际Client ID。清除旧令牌缓存并重新获取
旧的无效令牌可能还在缓存中,调用acquireTokenSilent前可以先调用logout或者清除浏览器缓存,确保获取新的有效令牌。验证令牌内容
用jwt.ms解码新获取的令牌,确认:aud字段是Web API的应用ID URI或Client IDscp字段包含access_as_user
额外检查点
Web API的Azure AD配置
确保.NET 6 Web API的appsettings.json中Azure AD配置正确:"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "your-tenant-domain.com", "TenantId": "your-tenant-id", "ClientId": "your-webapi-client-id" }并且在
Program.cs中正确启用了Azure AD认证:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); app.UseAuthentication(); app.UseAuthorization();权限授予状态
在Azure AD的React应用权限配置中,确保access_as_user权限已经授予管理员同意(如果是委托权限,用户登录时会自动获取,但部分场景需要提前授予)。
内容的提问来源于stack exchange,提问作者AlvinfromDiaspar
相关产品推荐
相关产品推荐

