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

如何使用AddSingleton注册ITokenAcquisition服务依赖(Microsoft.Identity.Web)

如何使用AddSingleton注册ITokenAcquisition依赖(Microsoft.Identity.Web)

首先要明确:你当前使用的EnableTokenAcquisitionToCallDownstreamApi()扩展方法,已经自动把ITokenAcquisition的实现类TokenAcquisition注册为Scoped生命周期服务——这也是官方推荐的配置方式。因为TokenAcquisition依赖HttpContext、IAuthenticationSchemeProvider等Scoped服务,改成Singleton生命周期会引发一系列问题,比如线程安全风险、上下文信息错乱、依赖注入失败等。

如果一定要强行用AddSingleton注册(不推荐),可以手动实例化TokenAcquisition并注册,同时手动解析它的所有依赖项,代码示例如下:

// 保留基础的认证配置,但去掉自动注册TokenAcquisition的扩展方法
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"));

// 手动注册ITokenAcquisition为Singleton
builder.Services.AddSingleton<ITokenAcquisition>(serviceProvider =>
{
    // 手动解析TokenAcquisition所需的所有依赖
    var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
    var authSchemeProvider = serviceProvider.GetRequiredService<IAuthenticationSchemeProvider>();
    var tokenCacheProvider = serviceProvider.GetRequiredService<ITokenCacheProvider>();
    var msIdentityOptions = serviceProvider.GetRequiredService<IOptions<MicrosoftIdentityOptions>>();
    var logger = serviceProvider.GetRequiredService<ILogger<TokenAcquisition>>();
    var systemClock = serviceProvider.GetRequiredService<ISystemClock>();

    return new TokenAcquisition(
        httpContextAccessor,
        authSchemeProvider,
        tokenCacheProvider,
        msIdentityOptions,
        logger,
        systemClock
    );
});

// 按需添加令牌缓存(如果需要调用下游API)
builder.Services.AddInMemoryTokenCaches();

重要注意事项

  • 强烈不建议采用Singleton生命周期:TokenAcquisition的核心逻辑和当前请求的用户上下文绑定,Singleton实例会在所有请求间共享,极易导致用户令牌泄露、身份信息混淆等严重问题。
  • 若需复用令牌获取逻辑,建议封装成Scoped服务调用已注册的ITokenAcquisition,而非修改其生命周期。

内容的提问来源于stack exchange,提问作者Pratik J Girme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:20:32