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

使用Autofac集成Keycloak JWT认证时依赖注入失败求助

解决Autofac依赖解析IHttpContextAccessor失败的问题

问题根源

DecisionRequirementHandler构造函数依赖的IHttpContextAccessor并非ASP.NET Core DI容器默认注册的服务,且当前注册的DecisionRequirementHandler为单例模式,与IHttpContextAccessor的Scoped生命周期冲突,双重原因导致Autofac无法完成依赖解析。

解决方案步骤

1. 手动注册IHttpContextAccessor

在Program.cs中添加IHttpContextAccessor的注册代码,确保该服务被加入DI容器:

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => containerBuilder.RegisterModule(new RepositoryServiceModule()));

// 新增:注册IHttpContextAccessor
builder.Services.AddHttpContextAccessor();

#region JWT
var jwtOptions = builder.Configuration.GetSection("JwtBearer").Get<JwtBearerOptions>();
builder.Services
   .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
   .AddJwtBearer(options =>
   {
      options.Authority = jwtOptions.Authority;
      options.Audience = jwtOptions.Audience;
      options.RequireHttpsMetadata = false;
      options.TokenValidationParameters = new TokenValidationParameters
      {
            NameClaimType = "preferred_username",
            RoleClaimType = "role" 
      };
   });

// 其余JWT、授权配置代码...
#endregion

2. 修正授权处理器的生命周期

将DecisionRequirementHandler的注册从单例改为InstancePerLifetimeScope(对应ASP.NET Core的Scoped生命周期),避免单例依赖Scoped服务引发的生命周期不匹配问题:

namespace InventoryManagement.API.Modules
{
   public class RepositoryServiceModule : Module
   {
      protected override void Load(ContainerBuilder builder)
      {
            // 其他服务注册代码...
            // 修改为InstancePerLifetimeScope,匹配IHttpContextAccessor的生命周期
            builder.RegisterType<DecisionRequirementHandler>().As<IAuthorizationHandler>().InstancePerLifetimeScope();
            // 仓储、服务批量注册代码...
      }
   }
}

原理说明

  • IHttpContextAccessor用于访问当前请求的HttpContext,ASP.NET Core默认不会自动注册该服务,必须通过AddHttpContextAccessor()手动添加。
  • 授权处理器通常与请求生命周期绑定,使用Scoped生命周期可以确保每次请求获取到正确的HttpContext,避免单例模式下上下文复用、资源释放错误等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:24