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

C#中使用客户端凭据认证Microsoft Graph遇令牌错误及令牌应用问题

解决Microsoft Graph客户端凭据流的"Either scp or roles claim need to be present in the token"错误

针对你遇到的这个错误,核心原因是获取的访问令牌中缺少应用权限对应的roles声明(客户端凭据流属于应用权限,对应roles声明;委托权限对应scp声明)。结合你的多租户应用+Sites.Selected权限场景,给出以下可行解决方法:

1. 验证令牌中的权限声明

把你已获取的访问令牌拿到jwt.ms解析,检查是否存在roles字段,且包含Sites.Selected权限。如果没有该声明,说明权限未正确授予:

  • 多租户应用仅在注册租户配置权限还不够,必须让目标租户的管理员完成应用权限的同意操作。
  • 确认你用PowerShell分配站点权限的命令是否正确,比如是否指定了正确的应用ID、站点ID,以及对应的权限范围(如Read.All/Write.All)。

2. 直接使用已获取的令牌初始化GraphServiceClient

既然你已经成功拿到有效访问令牌,可以绕开ClientSecretCredential,直接用令牌构造Graph客户端,代码示例如下:

// 替换为你实际获取到的访问令牌
string accessToken = "YOUR_VALID_ACCESS_TOKEN";

var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(async (requestMessage) =>
    {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        await Task.CompletedTask;
    }));

这种方式可以直接验证令牌有效性,如果调用Graph API成功,说明之前的ClientSecretCredential在获取令牌时存在租户上下文或权限同意的问题。

3. 调整多租户应用的令牌获取逻辑

如果要继续使用ClientSecretCredential,需要确保:

  • 若在目标租户(非注册租户)中使用,必须让该租户的管理员完成应用权限同意,否则无法获取包含roles声明的令牌。
  • 可以尝试将tenantId从common替换为目标租户的具体ID,确保获取的是该租户下的权限令牌,避免多租户上下文混淆。

内容的提问来源于stack exchange,提问作者Andrew Casey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:42:59