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

ASP.NET 6 WebAPI中Cookie认证会话重启后仍有效问题咨询

ASP.NET 6 Cookie认证:会话存储与重启后登录问题解答

1. 身份票据的存储位置

你调用await HttpContext.SignInAsync(...)生成的是加密的身份认证票据,这个票据直接存储在客户端的.AspNetCore.Cookies Cookie中,服务器端默认不会保存任何会话数据(因为你未启用AspNetCore.Session)。

服务器重启后仍能识别登录状态的核心原因:客户端请求时会携带该加密Cookie,服务器使用启动时配置的加密密钥(框架自动生成或手动配置)解密票据,验证签名与有效期,只要票据未过期且签名合法,就会判定用户处于登录状态。

2. 如何禁用“重启后仍保持登录”的特性

要实现服务器重启后旧Cookie失效,有两种常用方案:

方案1:缩短票据有效期(简单直接)

在配置Cookie认证时,设置较短的ExpireTimeSpan,同时关闭滑动过期,确保票据到期后自动失效,重启后即使Cookie存在也会被拒绝:

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        // 设置票据有效期,例如1小时
        options.ExpireTimeSpan = TimeSpan.FromHours(1);
        // 关闭滑动过期,避免自动延长有效期
        options.SlidingExpiration = false;
        // 同步Cookie过期时间与票据有效期
        options.Cookie.Expiration = options.ExpireTimeSpan;
    });

方案2:将票据存储在服务器端(彻底解决重启失效)

如果需要严格控制服务器重启后旧会话失效,可将身份票据存储在服务器端分布式缓存中(内存缓存、Redis等),服务器重启后缓存清空,旧Cookie对应的票据无法被匹配,自动失效:

  1. 添加分布式缓存服务(以内存缓存为例,生产环境推荐Redis):
builder.Services.AddDistributedMemoryCache();
  1. 配置Cookie认证时指定SessionStore:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        // 用分布式缓存存储票据
        options.SessionStore = new DistributedTicketStore(
            builder.Services.BuildServiceProvider().GetRequiredService<IDistributedCache>());
    });

注:DistributedTicketStore是ASP.NET Core内置实现,默认包含在WebAPI模板的Microsoft.AspNetCore.Authentication.Cookies包中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:50:37