如何将依赖注入与.net core JwtBearerOptions.Events一起使用?

Ily*_*dik 2 c# logging dependency-injection jwt asp.net-core

.Net Core ApiJwtBearer看起来像这样:

_services
    .AddJwtBearer(options =>
     {
        options.Events.OnAuthenticationFailed += MyMethod;
     });
Run Code Online (Sandbox Code Playgroud)

它实际上只是一个函数。现在我想使用ILogger服务配置中的一个,以便在记录失败的身份验证请求时使用。ILogger问题是我目前没有 的实例,而且我也没有真正看到获取它或使用工厂方法的好方法,因为我ServiceProvider两者都没有。

我已经这样解决了:

var loggerForAuthentication = _services.BuildServiceProvider().GetService<ILogger>();
Run Code Online (Sandbox Code Playgroud)

这将构建整个 DI 容器以返回我的ILogger. 这种方法有一些缺点,例如为这个确切的服务构建器生成它自己的单例,并且看起来也不正确。

还有其他方法可以做到这一点吗?

use*_*336 7

依赖注入容器仅在应用程序启动时构建一次。

当身份验证失败时会触发该事件,因此会发生请求。由于已经有一个可用的实例,因此无需再次构建 DI 容器。通过访问HttpContext此请求的 ,我们可以获得 的实例ILogger<T>

services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents
        {
            OnAuthenticationFailed = MyMethod()
        };
    });



private static Func<AuthenticationFailedContext, Task> MyMethod()
{
    return ctx =>
    {
        if (ctx.HttpContext.Request != null)
        {
            var logger = ctx.HttpContext.RequestServices.GetRequiredService<ILogger<Startup>>();
            logger.LogError(0, ctx.Exception, "Token validation failed");
        }

        return Task.CompletedTask;
    };
}
Run Code Online (Sandbox Code Playgroud)