使用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
相关产品推荐
相关产品推荐

