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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:22:38