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

使用DefaultAzureCredential时如何让Azure.Identity获取更新的客户端密钥配置?

问题分析与解决办法

问题根源

你遇到的核心问题是:DefaultAzureCredential实例在创建时会一次性读取Azure:ClientSecret的值,之后不会主动监听配置更新。而Key Vault配置提供的自动刷新只是更新了配置系统里的密钥,但已经初始化好的凭据实例不会重新读取新密钥,等到旧密钥过期后,自然就拿不到有效令牌了。

加载时机说明

  • DefaultAzureCredential本身不直接加载Azure:ClientSecret,只有当它的凭据链中触发ClientSecretCredential(适配客户端密钥的凭据类型)时,才会读取配置里的Azure:ClientSecret,这个读取动作是在凭据实例首次初始化时完成的。
  • EnableTokenAcquisitionToCallDownstreamApi()是用来配置下游API的令牌获取能力,它依赖的是已注册的身份验证服务,令牌获取时会用初始化好的凭据实例,所以密钥加载的关键节点在凭据实例创建的时候。

可行解决方案

方案1:将DefaultAzureCredential注册为Scoped服务

把凭据实例改成每个请求创建一次(Scoped生命周期),这样每次请求都会读取最新的配置密钥,同时完全不影响令牌缓存的作用。

具体操作:

  1. 先将DefaultAzureCredential注册为Scoped服务:
builder.Services.AddScoped(_ => 
    new DefaultAzureCredential(new DefaultAzureCredentialOptions() 
    { 
        ExcludeSharedTokenCacheCredential = true 
    })
);
  1. 调整Key Vault配置加载的代码,通过依赖注入获取凭据实例:
builder.Configuration.AddAzureKeyVault(
    sp => new SecretClient(
        new Uri(vaultUri),
        sp.GetRequiredService<DefaultAzureCredential>()
    ),
    new AzureKeyVaultConfigurationOptions
    {
        ReloadInterval = TimeSpan.FromHours(12)
    }
);
  1. 下游API的令牌获取逻辑会自动使用这个Scoped凭据,每次请求都能拿到最新的密钥。

方案2:监听配置刷新事件手动重建凭据(不推荐)

如果不想用Scoped实例,可以监听配置的Reloaded事件,在密钥更新时手动重新创建DefaultAzureCredential。但这种方式需要自己维护凭据的生命周期,代码复杂度高,不如方案1省心。

关于令牌缓存的疑问解答

AddInMemoryTokenCaches()缓存的是已经获取到的用户令牌,和DefaultAzureCredential实例的生命周期无关。哪怕每个请求都新建凭据实例,只要是同一个用户的请求,依然能从缓存中取到令牌,完全不会浪费缓存的优势。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:32:02