我想在ASP.NET Core 2.0中正确使用DI,以便让我的自定义方法处理OnTokenValidated在身份验证期间验证JWT令牌后触发的事件.下面的解决方案有效,除了在处理程序中我使用一个注入的服务MemoryCache来检查控制器中其他地方添加的缓存项(我已经验证它们已被添加和保留),并且当它被访问时,缓存总是空.我怀疑这是因为我的自定义处理程序对象是由另一个容器创建的(由于早期BuildServiceProvider()调用?)并且正在使用单独的MemoryCache(或类似的)实例.
如果是这种情况,我想我不清楚如何ConfigureServices()在startup.cs中正确添加和引用我的类和方法,以便它按预期工作.这就是我所拥有的:
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
...
services.AddScoped<IJwtTokenValidatedHandler, JwtTokenValidatedHandler>();
// add other services
...
var sp = services.BuildServiceProvider();
services.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, bOptions =>
{
// Configure JwtBearerOptions
bOptions.Events = new JwtBearerEvents
{
OnTokenValidated = sp.GetService<JwtTokenValidatedHandler>().JwtTokenValidated
};
}
Run Code Online (Sandbox Code Playgroud)
我的自定义处理程序类如下.该ValidateSessionAsync()调用使用AppSessionServiceinject来访问MemoryCache对象并确保存在缓存条目:
public class JwtTokenValidatedHandler : IJwtTokenValidatedHandler
{
AppSessionService _session;
public JwtTokenValidatedHandler(AppSessionService session)
{
_session = session;
}
public async Task JwtTokenValidated(TokenValidatedContext context)
{
// Add …Run Code Online (Sandbox Code Playgroud)