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

Azure AD守护程序应用中机密客户端应用程序的实例化位置咨询

Azure AD机密客户端应用实例化位置最佳实践

结论:应注册为单例服务,集中在启动类配置

不要在每个使用类中单独实例化ConfidentialClientApplication,正确的做法是在应用启动阶段(.NET Framework的Startup.cs或.NET 6+的Program.cs)将其注册为单例服务,然后通过依赖注入在需要的类中使用。

核心原因

  • 性能与资源优化:ConfidentialClientApplication内部维护了令牌缓存、HTTP连接池等核心资源,重复实例化会重建这些资源,带来不必要的性能开销,还会导致令牌缓存失效,频繁向Azure AD请求令牌,既降低效率也可能触发速率限制。
  • 配置集中化:集中在启动类配置,客户端ID、租户ID、密钥等配置信息只需维护一处,避免在多个类中重复编写,提升可维护性。
  • 资源复用:单例模式确保整个应用生命周期内只有一个实例,能最大化复用已有的连接和缓存,减少初始化操作。

代码示例

.NET 6+(Program.cs)

builder.Services.AddSingleton<IConfidentialClientApplication>(serviceProvider =>
{
    var configuration = serviceProvider.GetRequiredService<IConfiguration>();
    
    return ConfidentialClientApplicationBuilder
        .Create(configuration["AzureAd:ClientId"])
        .WithTenantId(configuration["AzureAd:TenantId"])
        .WithClientSecret(configuration["AzureAd:ClientSecret"])
        .Build();
});

在业务类中通过依赖注入使用

public class BusinessService
{
    private readonly IConfidentialClientApplication _confidentialClientApp;

    // 通过构造函数注入实例
    public BusinessService(IConfidentialClientApplication confidentialClientApp)
    {
        _confidentialClientApp = confidentialClientApp;
    }

    public async Task<string> FetchProtectedResourceAsync()
    {
        // 使用实例获取令牌
        var tokenResult = await _confidentialClientApp
            .AcquireTokenForClient(new[] { "https://your-api-url/.default" })
            .ExecuteAsync();

        // 携带令牌调用受保护资源
        using var httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.AccessToken);
        var response = await httpClient.GetAsync("https://your-api-url/resource");
        response.EnsureSuccessStatusCode();
        
        return await response.Content.ReadAsStringAsync();
    }
}

不推荐的做法:在使用类中直接实例化

如果在每个业务类中直接将ConfidentialClientApplication作为字段实例化(比如在类的构造函数中new),会带来以下问题:

  • 重复初始化资源,增加CPU和网络开销
  • 令牌缓存无法共享,每次都要重新请求Azure AD获取令牌
  • 配置信息分散在多个类中,维护成本高
  • 可能触发Azure AD的请求速率限制,导致服务调用失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:50:26