当前位置: 首页 > 编程语言 > C#

使用startup.cs中分配的delegate处理OnTokenValidated问题分享

时间:2023-04-11 00:15:03 C#

使用startup.cs中分配的delegate处理OnTokenValidated问题我想在ASP.NETCore2.0中正确使用DI,这样我可以使用自定义方法来处理在身份验证期间验证JWT令牌后触发的OnTokenValidated事件。下面的解决方案有效,除了在处理程序中我使用注入的服务命中MemoryCache来检查控制器中其他地方添加的缓存项(我已经验证它们已添加并持久化),并且当它被访问时,缓存是总是空的。我怀疑这是因为我的自定义处理程序对象是由不同的容器创建的(由于较早的BuildServiceProvider()调用?)并且正在使用MemoryCache(或类似)的单独实例。如果是这种情况,我想我不清楚如何在startup.cs的ConfigureServices()中正确添加和引用我的类和方法,以便它按预期工作。这就是我所拥有的:publicvoidConfigureServices(IServiceCollectionservices){services.AddMemoryCache();...服务.AddScoped();//添加其他服务...varsp=services.BuildServiceProvider();services.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,bOptions=>{//配置JwtBearerOptionsbOptions.Events=newJwtBearerEvents{OnTokenValidated=sp.GetService().JwtTokenValidated};}我的自定义处理程序类如下。ValidateSessionAsync()调用使用注册的AppSessionService访问MemoryCache对图像并确保保存在文件夹目录:publicclassJwtTokenValidatedHandler:IJwtTokenValidatedHandler{AppSessionService_session;publicJwtTokenValidatedHandler(AppSessionServicesession){_session=session;}publicasyncTaskJwtTokenValidated(TokenValidatedContextcontext){//添加access_token作为声明,因为我们实际上可能需要它varaccessToken=context.SecurityTokenasJwtSecurityToken;if(Guid.TryParse(accessToken.Id,outGuidsessionId)){if(await_session.ValidateSessionAsync(sessionIdn)){return}}thrownewSecurityTokenValidationException("会话对提供的令牌无效。");如果自定义的OnTokenValidated方法逻辑简单,不需要注入服务,我会内联一个匿名函数,或者在startup.cs中私下声明。如果可以的话,我宁愿修改这种方法,但我对其他方法持开放态度。不使用static/singletonevents,考虑JwtBearerEvents,使用JwtBearerOptions.EventsType选项:以上是C#学习教程:使用startup.cs中分配的delegate处理OnTokenValidated问题全部内容分享,如果对大家有用以及需要了解更多C#学习教程,希望大家多多关注——publicclassCustomJwtBearerEvents:JwtBearerEvents{AppSessionService_session;publicCustomJwtBearerEvents(AppSessionServicesession){_session=session;}publicoverrideasyncTaskTokenValidated(TokenValidatedContextAddascontext){//声明,因为我们实际上可能需要它varaccessToken=context.SecurityTokenasJwtSecurityToken;if(Guid.TryParse(accessToken.Id,outGuidsessionId)){if(await_session.ValidateSessionAsync(sessionId)){返回;}}newthrowSecurityTokenValidationException("会话对于提供的令牌无效。");}}publicclassStartup{publicvoidConfigureServices(IServiceCollectionservices){services.AddScoped();services.AddAuthentication().AddJwtBearer(options=>{options.EventsType=typeof(CustomJwtBearerEvents);});}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: