You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:45:57