Web开发:C# MVC + Session机制实现授权免登录demo

一、基础demo

【需求】

Home/Index 登录界面,校验成功后可以登录到Main/Index ,用户登录3分钟内关闭网站,再次访问Home/Index时可以免密登录Main/Index

【实现-后端HomeController】

cs 复制代码
using Microsoft.AspNetCore.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Login(string username, string password)
        {
            if (username == "1" && password == "100")//省略数据库读取步骤,假设校验成功了
            {
                CreateToken(HttpContext);//设置token
                return RedirectToAction("Index", "Main");//重定向到已登录界面
            }

            ViewBag.ErrorMessage = "登录失败,账密错误";
            return View("Index");//否则重定向到本页
        }

        private const string TokenSessionKey = "AuthToken";
        private const string TokenExpiryKey = "TokenExpiry";

        public static void CreateToken(HttpContext context)//创建token
        {
            var token = Guid.NewGuid().ToString();//设置token
            var expiry = DateTime.Now.AddMinutes(3);//设置过期日期

            context.Session.SetString(TokenSessionKey, token);
            context.Session.SetString(TokenExpiryKey, expiry.ToString("o")); // 使用 ISO 8601 格式
        }


    }
}

【实现-后端MainController】

cs 复制代码
using Microsoft.AspNetCore.Mvc;


namespace WebApplication1.Controllers
{
    public class MainController : Controller
    {

        public IActionResult Index()
        {
            if (!ValidateToken(HttpContext))//判断是否携带有效token
            {
                return RedirectToAction("Index", "Home");//不是则重定向到登录界面
            }

            return View();//否则重定向到本页(已登录页面)
        }
        private const string TokenSessionKey = "AuthToken";
        private const string TokenExpiryKey = "TokenExpiry";
        public static bool ValidateToken(HttpContext context)
        {
            var token = context.Session.GetString(TokenSessionKey);//尝试获取token
            var expiryString = context.Session.GetString(TokenExpiryKey);//尝试获取过期日期

            if (token == null || expiryString == null)
            {
                return false;//获取不到表明不是登陆状态
            }

            var expiry = DateTime.Parse(expiryString, null, System.Globalization.DateTimeStyles.RoundtripKind);//使用 ISO 8601 格式解析日期

            return DateTime.Now <= expiry;//判断是否过期,如果过期返回false
        }

    }
}

【前端-Home/Index】登录界面

html 复制代码
@{
    ViewData["Title"] = "Home";
}

<h1>Login</h1>

<form method="post" action="/Home/Login">
    <div>
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required />
    </div>
    <div>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required />
    </div>
    <button type="submit">Login</button>
</form>

@if (ViewBag.ErrorMessage != null)
{
    <p style="color:red;">@ViewBag.ErrorMessage</p>
}

【小结】

1.HttpContext是当前 HTTP 请求的上下文信息,它提供了有关请求和响应的各种数据和服务。

2.以上demo写法不查数据库,不封装AuthService 服务类,仅为展示基本的逻辑

3.前后端交互需要对应控制器名称、控制器下的方法名称

4.使用 ISO 8601 格式(例如 "o")来存储日期时间值,是为了确保日期时间的标准化和一致性

5.token 进行免登录时,需要管理或存储 token,方法有二:(本demo未展示此点)

  • 一是服务器或redis存储
  • 二是使用JWT将用户信息+过期时间嵌入 token 中,后端可以验证 token 的有效性,而不需要存储 token 本身。
相关推荐
竟未曾年少轻狂1 小时前
Vue3 生命周期钩子
前端·javascript·vue.js·前端框架·生命周期
TT哇1 小时前
【实习】数字营销系统 银行经理端(interact_bank)前端 Vue 移动端页面的 UI 重构与优化
java·前端·vue.js·ui
蓝帆傲亦1 小时前
Web前端跨浏览器兼容性完全指南:构建无缝用户体验的最佳实践
前端
晴殇i1 小时前
【前端缓存】localStorage 是同步还是异步的?为什么?
前端·面试
不一样的少年_1 小时前
Chrome 插件实战:如何实现“杀不死”的可靠数据上报?
前端·javascript·监控
深度涌现1 小时前
DNS详解——域名是如何解析的
前端
小码哥_常1 小时前
Android内存泄漏:成因剖析与高效排查实战指南
前端
卤代烃1 小时前
✨ 形势比人强,Chrome 大佬也去搞 Gemini 了
前端·agent·vibecoding
偶像佳沛1 小时前
JS 对象
前端·javascript
Jing_Rainbow2 小时前
【React-6/Lesson89(2025-12-27)】React Context 详解:跨层级组件通信的最佳实践📚
前端·react.js·前端框架