ASP.NET Core 6与ReactJS Azure身份验证集成:无法获取用户信息
问题分析与解决方案
1. 先确认AccessToken的受众是否匹配API的Client ID
你能调用MsGraph成功,是因为获取的token受众是https://graph.microsoft.com,但你的内部API需要以自身的Client ID作为受众。前端请求token时,必须指定你的API专属的scope,而非Graph的scope。
前端获取token的代码示例:
const request = { scopes: ["api://<你的API-Client-ID>/access_as_user"] // 替换成你API的实际权限范围 }; const response = await instance.acquireTokenSilent(request); const accessToken = response.accessToken;
2. 正确配置ASP.NET Core 6 API的身份验证中间件
确保API用官方的Microsoft Identity中间件处理Azure AD令牌,不要手动解析。在Program.cs中添加配置:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 中间件顺序必须是先认证再授权 app.UseAuthentication(); app.UseAuthorization();
同时在appsettings.json中配置Azure AD信息:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "<你的租户ID>", "ClientId": "<你的API-Client-ID>" }
3. 验证请求头格式是否正确
前端发送请求时,Authorization头必须严格遵循Bearer <access-token>格式,注意Bearer后的空格,以及令牌没有多余的字符:
// 以Axios为例 axios.get('/api/your-endpoint', { headers: { 'Authorization': `Bearer ${accessToken}` } });
4. 检查Token的有效性
用jwt.ms解析拿到的accessToken,重点确认:
aud字段值等于你的API的Client IDiss字段是你的租户的签发地址(格式如https://login.microsoftonline.com/<租户ID>/v2.0)exp字段未过期
如果aud不对,说明前端请求的scope配置错误,必须修正。
5. 确认[Authorize]属性的配置
如果API需要特定角色或权限,要在[Authorize]中明确指定,比如:
[Authorize(Roles = "InternalUser")] // 或者基于权限范围的策略 [Authorize(Policy = "RequireAccessAsUser")]
同时要确保token中包含对应的roles或scp声明。
内容的提问来源于stack exchange,提问作者Simon Painter
相关产品推荐
相关产品推荐

