Microsoft Graph登录未返回Azure应用配置的请求权限问题排查
问题排查与解决方案
1. 确认权限类型与令牌类型匹配
- 如果Azure中配置的是应用权限(Application Permissions):这类权限是给应用自身使用的,不会包含在用户登录后获取的access_token里。若要使用这类权限,需通过客户端凭据流(Client Credentials Flow)单独获取应用令牌,而非用户令牌。
- 如果是委派权限(Delegated Permissions),请继续排查以下配置问题。
2. 代码中必须明确请求目标权限范围
当前代码未指定要获取的权限范围,Azure AD无法识别需返回哪些权限。可通过两种方式修改配置:
- 方式一:在
AddMicrosoftIdentityWebApp的配置中直接添加权限范围:
.AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAd", options); // 添加Azure中配置的委派权限,示例为User.Read、Mail.Read,替换为你实际需要的权限 options.Scopes.Add("User.Read"); options.Scopes.Add("Mail.Read"); // 保留原有OnTokenValidated逻辑 options.Events.OnTokenValidated = async context => { var accessToken = context.SecurityToken as JwtSecurityToken; if (accessToken != null) { var claimsIdentity = context.Principal.Identity as ClaimsIdentity; if (claimsIdentity != null) { claimsIdentity.AddClaim(new Claim("access_token", accessToken.RawData)); } } }; })
- 方式二:若需调用下游API,结合
AddDownstreamApi配置:
.EnableTokenAcquisitionToCallDownstreamApi() .AddDownstreamApi("TargetApi", Configuration.GetSection("DownstreamApi")) .AddInMemoryTokenCaches();
同时在appsettings.json中添加下游API配置:
"DownstreamApi": { "BaseUrl": "https://graph.microsoft.com/v1.0", // 替换为你的目标API地址 "Scopes": "User.Read Mail.Read" // 替换为你实际需要的权限范围 }
3. 确认权限已完成授权
- 需管理员同意的委派权限:必须在Azure AD应用的「API权限」页面点击「授予管理员同意」,确保权限生效。
- 无需管理员同意的权限:用户首次登录时需完成授权确认,令牌才会包含对应权限。
4. 确保获取的是正确的Access Token
你在OnTokenValidated中获取的context.SecurityToken可能是ID Token(仅用于身份验证,不包含API权限)。若要获取用于调用API的Access Token,建议通过ITokenAcquisition服务获取,示例代码如下:
private readonly ITokenAcquisition _tokenAcquisition; public YourController(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async Task<IActionResult> YourAction() { string[] targetScopes = new string[] { "User.Read" }; // 替换为你的目标权限 string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(targetScopes); // 使用accessToken调用目标API return View(); }
内容的提问来源于stack exchange,提问作者Adalid
相关产品推荐
相关产品推荐

