.NET Core 6中如何在OnTokenValidated内清除Session?
解决.NET Core 6中OnTokenValidated事件内Session.Clear()无效的问题
问题原因
在OnTokenValidated事件中调用Session.Clear()后,内存中的Session数据确实会被清除,但由于Session默认采用延迟提交机制,再加上异步事件的上下文特性,修改可能没有被持久化到Session存储中。后续的请求(比如登录回调后的跳转)仍然会读取到旧的Session数据。
解决方案
1. 强制提交Session修改
在调用Session.Clear()后,主动调用CommitAsync()确保修改被持久化到存储中:
builder.Services.Configure<MicrosoftIdentityOptions>(options => { options.Events = new OpenIdConnectEvents { OnTokenValidated = async ctx => { // 检查数据库、设置Claims等操作.... ctx.HttpContext.Session.Clear(); // 强制提交Session修改,确保清除操作生效 await ctx.HttpContext.Session.CommitAsync(); } }; });
2. 确认中间件注册顺序
必须保证UseSession()中间件在认证相关中间件之前注册,否则Session无法在认证流程中被正确初始化和操作:
var app = builder.Build(); // 先注册Session中间件 app.UseSession(); // 再注册认证、授权中间件 app.UseAuthentication(); app.UseAuthorization(); // 其他业务中间件 app.MapRazorPages(); app.Run();
验证说明
修改完成后,OnTokenValidated事件内的Session清除操作会被持久化,后续Razor页面请求将无法读取到之前的Session变量。
内容的提问来源于stack exchange,提问作者MG123
相关产品推荐
相关产品推荐

