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

如何通过Microsoft.AspNetCore.Session检测过期会话并自动跳转?

ASP.NET Core 会话过期检测与自动重定向方案

有几种可行的方案实现会话过期检测与自动重定向,分别适配全局、局部或前端场景:

一、全局中间件方案(覆盖所有请求)

先确认你已经正确配置了Session:

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(20); // 自定义会话超时时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 注意注册顺序:在UseRouting之后、UseAuthorization之前添加UseSession
app.UseSession();

然后自定义一个会话检测中间件:

public class SessionExpirationMiddleware
{
    private readonly RequestDelegate _next;

    public SessionExpirationMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 排除不需要检测的路径,比如登录页、静态资源
        var requestPath = context.Request.Path.Value;
        if (!requestPath.StartsWith("/Account/Login") && 
            !requestPath.StartsWith("/lib/") && 
            !requestPath.StartsWith("/css/") && 
            !requestPath.StartsWith("/js/"))
        {
            // 用你存在Session里的关键标识判断会话有效性,比如用户ID
            if (context.Session.GetString("UserId") == null)
            {
                // 会话过期,重定向到登录页
                context.Response.Redirect("/Account/Login");
                return;
            }
        }

        await _next(context);
    }
}

// 扩展方法方便注册中间件
public static class SessionExpirationMiddlewareExtensions
{
    public static IApplicationBuilder UseSessionExpiration(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<SessionExpirationMiddleware>();
    }
}

最后在Program.cs里注册这个中间件(放在UseSession之后):

app.UseSessionExpiration();

二、Action过滤器方案(针对特定控制器/接口)

如果只需要给部分控制器做会话检测,用Action过滤器更灵活:

public class SessionCheckFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var session = context.HttpContext.Session;
        // 同样用Session中的关键标识判断有效性
        if (session.GetString("UserId") == null)
        {
            context.Result = new RedirectResult("/Account/Login");
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 无需额外处理
    }
}

注册方式二选一:

// 全局注册:所有控制器都会生效
builder.Services.AddControllersWithViews(options =>
{
    options.Filters.Add<SessionCheckFilter>();
});

// 局部注册:只给目标控制器添加特性
[TypeFilter(typeof(SessionCheckFilter))]
public class HomeController : Controller
{
    // ...
}

三、前端定时检测方案(提前提醒/自动跳转)

如果需要在用户无操作时主动检测会话状态,可配合前端定时请求后端接口:

  1. 后端写一个检测接口:
[HttpGet]
public IActionResult CheckSessionStatus()
{
    if (HttpContext.Session.GetString("UserId") == null)
    {
        return Unauthorized();
    }
    return Ok();
}
  1. 前端用JS定时检测:
// 每隔5分钟检查一次(建议设为超时时间的一半,比如超时20分钟就每10分钟查一次)
setInterval(() => {
    fetch('/Home/CheckSessionStatus')
        .then(response => {
            if (!response.ok) {
                // 会话过期,跳转到登录页
                window.location.href = '/Account/Login';
            }
        })
        .catch(err => console.log('会话检测失败:', err));
}, 300000); // 300000毫秒=5分钟

注意事项

  • 会话有效性的判断依赖你存在Session中的业务标识(比如用户ID),因为Session过期后内部存储的所有值都会被清空。
  • 一定要排除登录页、静态资源路径,避免出现循环重定向的问题。
  • 前端检测的时间间隔建议小于Session的IdleTimeout,提前发现过期状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:25