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
. 这种方法有一些缺点,例如为这个确切的服务构建器生成它自己的单例,并且看起来也不正确。
还有其他方法可以做到这一点吗?
依赖注入容器仅在应用程序启动时构建一次。
当身份验证失败时会触发该事件,因此会发生请求。由于已经有一个可用的实例,因此无需再次构建 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)
归档时间: |
|
查看次数: |
1710 次 |
最近记录: |