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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:47:57