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

使用客户端凭据流的长期运行API如何刷新Microsoft Graph访问令牌

结论

你无需手动处理访问令牌的过期逻辑,现有依赖库已经内置了自动刷新能力,只要遵循正确的使用规范即可:

  • 核心能力自动生效:你当前使用的ClientSecretCredential属于Azure Identity官方库的内置凭证类,本身自带内存级令牌缓存机制。它会自动存储首次申请的访问令牌,在令牌过期前自动发起请求获取新的令牌,整个过程对上层调用完全透明。
  • 必须复用实例:不要在每次调用Graph接口前都重新创建ClientSecretCredential或者GraphServiceClient实例,这会导致令牌缓存失效,频繁触发令牌申请请求被Azure AD限流。正确的做法是在服务启动时初始化一次GraphServiceClient,作为单例对象全局复用。
    如果是ASP.NET Core服务,可通过依赖注入直接注册单例:
    // Program.cs 注册服务
    builder.Services.AddSingleton<GraphServiceClient>(sp =>
    {
        var config = sp.GetRequiredService<IConfiguration>();
        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var credential = new ClientSecretCredential(
            config["AppSettings:TenantId"],
            config["AppSettings:AppId"],
            config["AppSettings:ClientSecret"]
        );
        return new GraphServiceClient(credential, scopes);
    });
    
    之后在业务逻辑中直接通过构造函数注入GraphServiceClient使用即可。
  • 兜底重试机制:Microsoft Graph SDK默认内置了重试中间件,即使出现极端情况(比如缓存异常导致使用了过期令牌,接口返回401状态码),SDK会自动拦截响应,重新申请有效令牌后重试请求,不会影响业务正常调用。如果你需要自定义重试规则,也可以手动配置重试策略:
    // 自定义重试配置示例
    var retryOption = new RetryHandlerOption
    {
        MaxRetry = 3,
        ShouldRetry = (delay, attempt, response) =>
            response.StatusCode == System.Net.HttpStatusCode.Unauthorized
            || RetryHandler.IsTransientStatusCode(response.StatusCode)
    };
    var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
    graphClient.Middleware.Insert(0, new RetryHandler(retryOption));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:24:02