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

.NET Core 7中停止程序时如何自动执行Google OAuth 2.0登出?

解决.NET Core 7谷歌认证程序停止后Cookie残留的问题

首先明确:程序停止时,服务器无法主动触发浏览器执行登出操作(HTTP是无状态协议,服务端停止后无法向已连接的客户端发送指令)。但可以通过以下两种方式优化,避免Cookie长期残留:

1. 配置认证Cookie的过期策略

在配置谷歌认证时,同时设置认证Cookie的过期规则,让Cookie自动失效,无需服务端主动干预。

在Program.cs的认证配置中,添加Cookie的过期设置:

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    // 设置Cookie有效期,比如30分钟无操作自动过期
    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    // 启用滑动过期,用户活跃时自动延长有效期
    options.SlidingExpiration = true;
    // 关闭浏览器时立即清除Cookie
    options.Cookie.SameSite = SameSiteMode.Lax;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
})
.AddGoogle(options =>
{
    options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
    options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
});

这样配置后,即使程序意外停止,Cookie也会在设定时间后自动失效,或者用户关闭浏览器时直接清除。

2. 程序关闭时清理服务器端会话(若使用分布式存储)

如果应用使用了分布式会话存储(比如Redis),可以在程序关闭时清理服务器端的会话数据,避免后续重启程序时残留无效会话:

在Program.cs中注册应用停止事件的回调:

var app = builder.Build();

// 注册应用停止时的处理逻辑
var lifetime = app.Services.GetRequiredService<IHostApplicationLifetime>();
lifetime.ApplicationStopping.Register(() =>
{
    // 清理服务器端会话或认证相关存储
    // 示例:使用IDistributedCache清除会话键(需根据实际键前缀调整)
    var cache = app.Services.GetRequiredService<IDistributedCache>();
    // cache.Remove("your-session-key-prefix");
});

// 后续中间件配置...
app.Run();

注意:这种方式仅能清理服务器端数据,无法清除浏览器中的Cookie,因此仍需结合Cookie过期配置解决客户端残留问题。

关键说明

HttpContext.SignOutAsync()需要客户端发起请求时才能执行,程序停止时没有活跃的HttpContext可供调用该方法。因此,核心解决方案是通过Cookie的生命周期配置让客户端自动处理过期,而非依赖服务端停止时的主动触发。

内容的提问来源于stack exchange,提问作者Kuj9xst3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:19