【问题标题】:How to use dependency injection with .net core JwtBearerOptions.Events?如何在.net core JwtBearerOptions.Events 中使用依赖注入?
【发布时间】:2020-04-17 09:30:56
【问题描述】:

JwtBearer 的 .Net Core Api 如下所示:

_services
    .AddJwtBearer(options =>
     {
        options.Events.OnAuthenticationFailed += MyMethod;
     });

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

我已经这样解决了:

var loggerForAuthentication = _services.BuildServiceProvider().GetService<ILogger>();

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

还有其他方法吗?

【问题讨论】:

    标签: c# asp.net-core logging dependency-injection jwt


    【解决方案1】:

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

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

    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;
        };
    }
    

    【讨论】:

    • 感谢您的回答,我看到 HttpContext 确实提供了一个服务位置(反)模式来使用。这不是最理想的,但可以工作,尽管每次都需要分辨率,而实际上只能获取一次。如果没有内置的 DI,无论如何也不是那么容易解决的......在我看来这不是一个好的解决方案,但考虑到框架限制,可能唯一剩下的......
    • 将方法定义为 private static Task MyMethod(AuthenticationFailedContext ctx) 而不是返回委托的方法会更有意义。
    猜你喜欢
    • 2019-03-14
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2021-07-15
    • 2021-10-23
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多