ASP.NET Core自定义AuthenticationHandler依赖注入问题求助
在自定义AuthenticationHandler中注入IRepository的解决方案
别担心,这个问题其实很常见,调整下构造函数并做好DI配置就能解决,一步步来:
1. 修改CustomAuthenticationHandler的构造函数
AuthenticationHandler基类本身需要几个必要参数,你只需要在自定义构造函数里追加IRepository参数,把它赋值给私有字段就行,记得保留基类要求的参数:
public class CustomAuthenticationHandler : AuthenticationHandler<CustomAuthenticationOptions> { private readonly IRepository _repository; // 扩展构造函数,添加IRepository注入参数 public CustomAuthenticationHandler( IOptionsMonitor<CustomAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IRepository repository) // 这里注入你的仓储实例 : base(options, logger, encoder, clock) { _repository = repository; } // 现在你可以在身份验证逻辑里使用_repository了 protected override async Task<AuthenticateResult> HandleAuthenticateAsync() { // 示例:从请求提取凭据,用仓储验证 var credentials = GetCredentialsFromRequest(); var validUser = await _repository.VerifyCredentialsAsync(credentials); if (validUser == null) { return AuthenticateResult.Fail("Invalid credentials"); } // 构建验证票据返回成功结果 var claims = new List<Claim> { new Claim(ClaimTypes.Name, validUser.Username) }; var identity = new ClaimsIdentity(claims, Scheme.Name); var principal = new ClaimsPrincipal(identity); var ticket = new AuthenticationTicket(principal, Scheme.Name); return AuthenticateResult.Success(ticket); } // 辅助方法:根据你的认证方式提取凭据(示例) private Credentials GetCredentialsFromRequest() { // 比如从请求Header、QueryString里提取,这里按需实现 return new Credentials(); } }
2. 把IRepository注册到DI容器
在Program.cs(.NET6+)或者Startup.cs里,先将仓储服务注入到依赖注入容器,比如:
// 根据你的业务场景选择Scoped/Transient/Singleton builder.Services.AddScoped<IRepository, SqlServerRepository>();
3. 配置认证服务时关联自定义Handler
最后在配置Authentication的环节,用AddScheme把你的自定义Handler和认证方案绑定:
builder.Services.AddAuthentication(options => { // 可选:设置默认的认证/挑战方案 options.DefaultAuthenticateScheme = "CustomAuthScheme"; options.DefaultChallengeScheme = "CustomAuthScheme"; }) .AddScheme<CustomAuthenticationOptions, CustomAuthenticationHandler>("CustomAuthScheme", options => { // 这里可以配置CustomAuthenticationOptions的自定义参数 options.ExpirationMinutes = 30; });
这样DI容器在创建CustomAuthenticationHandler实例时,就会自动注入你注册好的IRepository实现了。
小提醒:如果是.NET 7+版本,ISystemClock已经被标记为过时,可以换成TimeProvider timeProvider作为构造函数参数,基类调用也同步替换即可。
内容的提问来源于stack exchange,提问作者Luke1988
相关产品推荐
相关产品推荐

