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

.NET Core MVC会话超时重定向及SessionTimeout特性实现方法问询

实现.NET Core中会话超时自动重定向的[SessionTimeout]自定义特性

刚接触.NET Core就能想到用自定义特性来简化重复的会话检查逻辑,这个思路太赞了!下面我一步步带你实现这个[SessionTimeout]特性,让你不用在每个Action里写重复代码,自动处理会话超时后的重定向:

第一步:创建自定义Action过滤器特性

咱们要做的是一个Action过滤器特性,它会在Action执行前自动检查会话状态。新建一个类,比如SessionTimeoutAttribute,继承自ActionFilterAttribute,并重写OnActionExecuting方法:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class SessionTimeoutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // 检查会话是否超时:这里假设你用Session["UserId"]存储登录用户标识
        // 你可以换成自己项目中用来标记登录状态的Session键
        if (context.HttpContext.Session.GetString("UserId") == null)
        {
            // 会话超时,重定向到登录页
            // 如果需要登录后跳回原页面,可以把当前URL存入TempData
            context.HttpContext.TempData["ReturnUrl"] = context.HttpContext.Request.Path;
            
            context.Result = new RedirectToActionResult("Login", "Account", null);
        }

        base.OnActionExecuting(context);
    }
}

第二步:确保你的项目已启用Session

如果还没配置Session,得先在Program.cs里启用它,不然Session功能没法用:

var builder = WebApplication.CreateBuilder(args);

// 添加Session服务,设置超时时间(比如20分钟)
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(20);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 添加MVC服务
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 启用Session中间件(注意要放在UseRouting之后,UseAuthorization之前)
app.UseSession();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

第三步:在你的Action上标记特性

现在回到你原来的Index Action,只需要加上[SessionTimeout]特性,就能自动触发会话检查了:

[SessionTimeout] // 加上这个特性就搞定啦!
public async Task<IActionResult> Index() 
{ 
    var product = await productRepository.GetAll(); 
    ViewBag.Title = "List Of Products"; 
    return View(product); 
}

额外优化:登录后跳回原页面

如果想让用户登录后自动回到之前访问的页面,可以在登录Action里读取TempData["ReturnUrl"]:

[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
    // 验证登录逻辑...
    if (ModelState.IsValid)
    {
        // 登录成功,设置Session
        HttpContext.Session.SetString("UserId", model.UserId);
        
        // 跳回原页面,没有的话就跳首页
        var returnUrl = TempData["ReturnUrl"] as string;
        return Redirect(returnUrl ?? "/");
    }
    
    return View(model);
}

这样就完美实现了你想要的功能:不用在每个Action里写会话检查代码,只需要加个特性,就能自动在会话超时后重定向到登录页啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:52:26