首页 > 编程语言 >Web开发:C# MVC + Session机制实现授权免登录demo

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

时间:2024-08-14 21:23:00浏览次数:14  
标签:Web return Index C# app token Session Home public

token基础demo

【需求】

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

【配置文件-Program.cs】




var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

//加一个session
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(3); // 3分钟过期
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

//使用session
app.UseSession();


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

app.Run();

【实现-后端HomeController】

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】

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】登录界面

@{
    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存储token
  • 二是使用JWT将用户信息+过期时间嵌入 token 中,后端可以验证 token 的有效性,而不需要存储 token 本身。

拓展

Q:如果需要增加注销功能,应该如何实现?

A :Main/Index加一个注销按钮,MainController清除token和过期时间即可

后端:

 // 触发注销方法
    public IActionResult Logout()
    {
        HttpContext.Session.Remove(TokenSessionKey); // 清除 token
        HttpContext.Session.Remove(TokenExpiryKey);  // 清除过期时间

        return RedirectToAction("Index", "Home"); // 注销后重定向到主页
    }

前端: 

<button onclick="logout()">Logout</button> <!-- 注销按钮 -->
<script>
    function logout() {
        fetch('/Main/Logout', { // 调用后端的 Logout 方法
            method: 'POST', // 使用 POST 请求
            headers: {
                'Content-Type': 'application/json'
            },
            credentials: 'same-origin' // 确保发送会话 cookie
        })
        .then(response => {
            if (response.ok) {
                window.location.href = '/Home/Index'; // 注销成功后重定向到主页
            } else {
                console.error('Logout failed');
            }
        })
        .catch(error => console.error('Error:', error));
    }
</script>

标签:Web,return,Index,C#,app,token,Session,Home,public
From: https://blog.csdn.net/m0_67412019/article/details/141144216

相关文章

  • 『模拟赛』暑假集训CSP提高模拟20
    Rank有点可惜,暴力打满就并列Rank1了。A.Kanon原[JOI2021Final]雪玉签。考虑到每两个球之间的距离是恒不变的,因此我们可以通过找到每个球控制的边界得到答案,每个区间正好可以得出左边球的右边界和右边球的左边界。记录每个区间的标号和长度,按长度升序sort一遍,然......
  • ComfyUI系列教程(4)--ComfyUI基础节点LoRA
    ComfyUI基础节点LoRA2.ComfyUI基础节点2.1.LoRA2.1.1.LoRA原理2.1.2.LCM-LoRA2.1.3.ComfyUI示例2.ComfyUI基础节点本文主要介绍LoRA模型及ComfyUI中LoRA的连接方式。2.1.LoRALoRA是一种低成本微调大模型的方法,可以通过训练LoRA模型增强对应版本大模型的生成......
  • 【面试】分别解释一下C++、Java、Python程序的执行过程
    面试模拟场景面试官:你能分别解释一下C++、Java、Python程序的执行过程吗?参考回答示例1.C++程序的执行过程1.1编译过程:源代码编写:开发者编写C++源代码,文件扩展名为.cpp。预编译(Preprocessing):预编译是编译的第一步,使用预处理器(如cpp)对源代码进行处理。这一步主......
  • pytorch 3 计算图
    计算图结构分析:起始节点ab=5-3ac=2b+3d=5b+6e=7c+d^2f=2e最终输出g=3f-o(其中o是另一个输入)前向传播前向传播按照上述顺序计算每个节点的值。反向传播过程反向传播的目标是计算损失函数(这里假设为g)对每个中间变量和输入的偏导数。从右向左......
  • Datawhale X 魔搭 AI夏令营 AIGC方向 task2笔记
       纯小白,自学!从零入门AI生图(AIGC方向)基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展实践学习。#DatawhaleX魔搭AI夏令营#一、利用AI精读baseline学习代码   task2的目的是精读baseline,从代码层面理解AI生图,直播演示了用通义千问解析代码,我也用GPT-4o,文心......
  • Sakana 推出开源AI Scientist:科研论文编写一条龙搞定
    你有没有想过,未来的科研会是怎样的?想象一下,一个不眠不休的研究助手,能够在没有人类监督的情况下,独立进行科学研究,从提出新想法到执行实验,再到撰写论文,全部自动完成。这听起来像科幻电影的情节,但在SakanaAI的努力下,这一愿景正在一步步变为现实。在现代科学研究中,科研人员常......
  • 【Material-UI】Floating Action Button (FAB) 详解:动画效果 (Animation)
    文章目录一、FAB按钮的动画概述1.默认动画效果2.多屏幕横向切换时的动画二、FAB动画效果的实现1.代码示例:跨标签页的FAB动画2.代码解析3.多个FAB的切换三、动画效果的最佳实践四、总结在现代网页设计中,动画不仅提升了用户界面的动态感,还增强了用户的交......
  • 视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
            ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台,所以暂时不进行安装)视觉SLAMch3—三维空间的刚体运动http......
  • ADALORA: ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING 笔记
    ADALORA的前世今生......
  • Coin Troubles题解(dp,拓扑序)
    CoinTroubles题解(dp,拓扑序)题目链接:https://codeforces.com/problemset/problem/283/C题意:有\(n\)种硬币,每种硬币都有一个价格\(ai\),现在有\(q\)个限制,每个限制会告诉你\((b,c)\),并要求\(b\)种硬币的数量严格大于\(c\)种硬币的数量。现在问你一共有多少种买硬币的方法,使得最后......