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

为何我的GraphServiceClient每次调用API都要重新进行身份验证

问题表现
  • 使用C#版本Microsoft Graph SDK调用接口时,每次请求都会先执行身份验证获取新token
  • 抓包截图:
    抓包记录
  • 部分调用返回报错:AADSTS50196: 服务器因检测到客户端请求循环,已终止操作
原因分析
  • GraphServiceClient实例生命周期配置错误:如果每次调用接口都新建GraphServiceClient实例,SDK内置的token缓存会随实例销毁失效,导致每次都需要重新申请token。
  • 身份验证凭证未共享:Azure Identity库提供的ClientSecretCredential、DefaultAzureCredential等凭证类自带内存缓存,若每次请求都新建凭证实例,缓存无法生效,会重复请求AAD获取token。
  • 自定义身份验证提供程序未实现缓存逻辑:如果自行实现了IAuthenticationProvider接口,没有添加token缓存逻辑,每次调用都会直接发起身份验证请求。
  • AADSTS50196错误是AAD的限流保护机制触发:同一客户端短时间内请求token的频次超过阈值(默认100次/分钟),就会被服务端判定为请求循环,拒绝服务。
解决方法
  • 全局共享GraphServiceClient实例:在依赖注入框架中注册GraphServiceClient为单例,非DI场景下全局维护同一个实例,不要每次调用都新建。
    ASP.NET Core DI 注册示例:
builder.Services.AddSingleton<GraphServiceClient>(sp =>
{
    // 共享同一个ClientSecretCredential实例,启用内置缓存
    var credential = new ClientSecretCredential(
        tenantId: "YOUR_TENANT_ID",
        clientId: "YOUR_CLIENT_ID",
        clientSecret: "YOUR_CLIENT_SECRET"
    );
    return new GraphServiceClient(credential, new[] { "https://graph.microsoft.com/.default" });
});
  • 自定义身份验证逻辑时补充缓存实现:如果自行实现身份验证流程,需要缓存获取到的token,在token过期前5分钟左右提前刷新,避免重复请求。
  • 多实例部署场景配置分布式缓存:如果服务是多实例部署,可以将token缓存到Redis等分布式存储中,避免多个实例各自重复申请token。
  • 触发限流后可暂停1~2分钟再重试,即可恢复正常请求。

内容的提问来源于stack exchange,提问作者Rafa Ayadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:48:03