我使用JWT承载令牌来保护我的ASP.NET Core 2.1 Web API。在ConfigureServices
期间,我设置了身份验证,并通过选项绑定了JwtBeaererEvents
对象以进行其他处理。我希望该对象成为DI容器的一部分,但是我不确定该怎么做。现在,我必须创建实例并将其通过构造函数(反模式)传递。但这将创建一个鸡加蛋的场景:
/* HACK */
var sp = services.BuildServiceProvider();
services.AddAuthentication(opts =>
{
opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opts =>
{
opts.Audience = "https://foobar.com/FooAPI";
opts.Authority = Constants.AuthEndpointPrefix + "common/";
opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false };
/* I would like JwtBearerEvents to be part of the
DI container and request the Logger and AppInsights
Dependency through the ctor
*/
opts.Events = new
JwtBearerEvents(
LoggerFactory.CreateLogger<JwtBearerEvents>(),
sp.GetService<TelemetryClient>()
);
});
答案 0 :(得分:3)
ASP.NET Core 2中的身份验证系统使用身份验证方案选项的EventsType
property本机支持此操作:
services.AddTransient<MyJwtBearerEvents>();
services.AddAuthentication()
.AddJwtBearer(options =>
{
options.EventsType = typeof(MyJwtBearerEvents);
});
如果设置了此属性,则在请求开始时初始化身份验证方案时,事件实例将得到解析。
除此之外,请注意,您还可以访问作为事件上下文的一部分传递的HttpContext
实例,并使用服务定位器模式来解析事件处理程序中的服务。尽管通常不是最好的服务定位器,但是如果您只需要为特定事件类型提供某些依赖项,它可以在这种情况下为您提供更多的灵活性。