asp.net core中的 Cookie 和 Session

news2025/1/8 5:10:35

在 Web 开发中,用户会话管理是非常重要的,尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术,如 CookieSession,它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细讲解如何理解并使用这些技术。

1. Cookie

Cookie 是一种用于在客户端(用户浏览器)保存信息的技术。它通常用于存储用户的会话信息、身份验证数据、用户设置等。Cookie 在 Web 开发中用于在不同页面请求之间传递信息,确保用户的状态在多个请求之间保持一致。

1.1 如何使用 Cookie

在 ASP.NET Core 中,使用 Cookie 主要有两种方式:

  1. 通过 HttpContext.Response.Cookies 设置 Cookie
  2. 通过 HttpContext.Request.Cookies 获取 Cookie

1.2 设置 Cookie

你可以通过 HttpContext.Response.Cookies.Append 方法来设置 Cookie。这个方法允许你定义 Cookie 的名称、值、过期时间等属性。

示例:设置一个简单的 Cookie
public IActionResult SetCookie()
{
    // 设置一个名为 "UserName" 的 Cookie,值为 "JohnDoe",并设置有效期为 1 天
    CookieOptions option = new CookieOptions
    {
        Expires = DateTime.Now.AddDays(1),  // Cookie 过期时间
        HttpOnly = true,                    // 防止客户端 JavaScript 访问此 Cookie
        Secure = true                       // 仅在 HTTPS 下传输此 Cookie
    };
    Response.Cookies.Append("UserName", "JohnDoe", option);

    return Content("Cookie 已设置");
}

1.3 获取 Cookie

使用 HttpContext.Request.Cookies 可以获取 Cookie 的值。

示例:读取 Cookie
public IActionResult GetCookie()
{
    // 获取名为 "UserName" 的 Cookie
    var userName = Request.Cookies["UserName"];

    if (userName == null)
    {
        return Content("Cookie 不存在");
    }

    return Content($"Cookie 的值为: {userName}");
}

1.4 删除 Cookie

可以通过 HttpContext.Response.Cookies.Delete 删除指定名称的 Cookie。

示例:删除 Cookie
public IActionResult DeleteCookie()
{
    // 删除名为 "UserName" 的 Cookie
    Response.Cookies.Delete("UserName");

    return Content("Cookie 已删除");
}

1.5 Cookie 的安全性

  • HttpOnly:指定 Cookie 是否可以被 JavaScript 访问。如果设置为 true,则该 Cookie 只能通过 HTTP 请求访问,不能通过 JavaScript 获取,增加了安全性。
  • Secure:指定 Cookie 是否只在 HTTPS 下发送。可以防止 Cookie 在不安全的 HTTP 连接中被窃取。
  • SameSite:控制跨站请求是否发送 Cookie。可以设置为 StrictLax 或 None

2. Session

Session 是服务器端存储的一种技术,它用于在多个请求之间保持用户的状态。与 Cookie 不同,Session 存储在服务器上,而不是客户端。每个用户会话都有一个唯一的会话标识符(通常是通过 Cookie 来传递该标识符)。Session 可以存储任何类型的数据,但它的大小通常受到限制。

2.1 如何使用 Session

在 ASP.NET Core 中,Session 通过 ISession 接口进行管理。你需要先在 Startup.cs 中配置 Session。

2.1.1 配置 Session

Startup.cs 中的 ConfigureServices 方法里,启用 Session 服务。

public void ConfigureServices(IServiceCollection services)
{
    // 启用 Session 中间件
    services.AddDistributedMemoryCache(); // 使用内存缓存作为会话存储
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);  // 设置会话过期时间
        options.Cookie.HttpOnly = true;                  // 防止客户端 JavaScript 访问会话 Cookie
        options.Cookie.IsEssential = true;               // 标记为“必要”Cookie
    });
}
2.1.2 使用 Session

你可以在控制器中通过 HttpContext.Session 来访问和存储会话数据。

示例:设置 Session
public IActionResult SetSession()
{
    // 存储用户名称到 Session
    HttpContext.Session.SetString("UserName", "JohnDoe");
    return Content("Session 已设置");
}
示例:获取 Session
public IActionResult GetSession()
{
    // 获取 Session 中的用户名称
    var userName = HttpContext.Session.GetString("UserName");

    if (userName == null)
    {
        return Content("Session 不存在");
    }

    return Content($"Session 中的用户名称为: {userName}");
}
示例:删除 Session
public IActionResult DeleteSession()
{
    // 删除名为 "UserName" 的 Session
    HttpContext.Session.Remove("UserName");
    return Content("Session 已删除");
}

2.2 Session 的特点与优势

  • 存储在服务器端:Session 数据存储在服务器上,因此比 Cookie 更安全,因为它不容易被客户端篡改。
  • 状态持久化:会话在多个请求之间持续有效,直到会话过期或被手动清除。
  • 依赖 Cookie:通常使用一个 Cookie 来存储会话标识符(ASP.NET_SessionId),但是数据本身存储在服务器端。

3. Cookie 和 Session 的对比

特性CookieSession
存储位置存储在客户端(浏览器)存储在服务器端
大小限制一般为 4KB受服务器配置和存储限制
安全性可能被客户端篡改,需要加密更安全,因为数据存储在服务器上
生命周期可以设置过期时间默认与浏览器会话持续,或者通过配置设置超时时间
性能对服务器影响小会消耗服务器内存,可能影响性能

3.1 Cookie 适用场景

  • 存储少量数据(如用户首选项、记住我功能)。
  • 数据不敏感,不需要长期存储或安全性要求较低的场景。

3.2 Session 适用场景

  • 存储较为敏感的数据(如用户登录状态、购物车等)。
  • 数据存储量较大,或者需要在服务器端进行集中管理的场景。

4. 用户会话管理

用户会话管理通常涉及以下几步:

  1. 用户登录:用户登录时,服务器验证用户身份,生成会话数据,并将会话标识符存储在客户端 Cookie 中,同时在服务器端存储相关用户信息(如用户 ID、角色、权限等)。
  2. 请求时验证:每次用户发送请求时,服务器通过 Cookie 中的会话标识符来查找用户的会话数据,验证用户的身份并维持状态。
  3. 会话过期:根据 Session 的配置,会话可以在一定时间内过期。过期后,用户需要重新登录。
示例:用户登录过程
public IActionResult Login(string userName, string password)
{
    // 假设验证成功,创建 Session 和 Cookie
    if (IsValidUser(userName, password))
    {
        // 存储用户信息到 Session
        HttpContext.Session.SetString("UserName", userName);

        // 设置一个 Cookie 来记住用户(可选)
        CookieOptions option = new CookieOptions
        {
            Expires = DateTime.Now.AddDays(7),  // 7 天有效期
        };
        Response.Cookies.Append("UserName", userName, option);

        return RedirectToAction("Index");
    }

    return Content("用户名或密码错误");
}

4.1 常见的用户会话管理功能

  • 登录和注销:登录时生成 Session 或 Cookie,注销时删除 Session 或 Cookie。
  • 记住我功能:通过 Cookie 来记住用户的登录状态。
  • 自动过期/失效:会话数据在过期时间到期后失效,防止长期占用资源。

5. 总结

  • Cookie 和 Session 是常用的用户状态管理技术,Cookie 存储在客户端,Session 存储在服务器端。
  • Cookie 适合存储轻量级数据(如用户设置),而 Session 适合存储敏感数据(如登录状态)。
  • 在实现用户会话管理时,可以结合使用 Cookie 和 Session,确保安全性和良好的用户体验。

通过合理使用这两种技术,你可以在 ASP.NET Core 中实现一个高效、安全的用户会话管理系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云架构Web端的工业MES系统设计之区分工业过程

云架构Web端的工业MES系统设计之区分工业过程 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智能的生产…

TCP协议:三次握手、四次挥手

文章目录 三次握手1. 什么是三次握手?2. 为什么是三次握手? 四次挥手1. 什么是四次挥手?2. 为什么是四次挥手? 引用 三次握手 1. 什么是三次握手? 三次握手是TCP协议中用于建立连接的过程。 第一次,表示请…

guestfish/libguestfs镜像管理工具简介

文章目录 简介guestfishlibguestfs项目 例子原理代码libguestfs架构参考 简介 guestfish Guestfish 是libguestfs项目中的一个工具软件,提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地,而是为你提供一个shell接口,你可以查…

详解GPT-信息抽取任务 (GPT-3 FAMILY LARGE LANGUAGE MODELS)

GPT-3 FAMILY LARGE LANGUAGE MODELS Information Extraction 自然语言处理信息提取任务(NLP-IE):从非结构化文本数据中提取结构化数据,例如提取实体、关系和事件 [164]。将非结构化文本数据转换为结构化数据可以实现高效的数据处…

云备份项目--服务端编写

文章目录 7. 数据管理模块7.1 如何设计7.2 完整的类 8. 热点管理8.1 如何设计8.2 完整的类 9. 业务处理模块9.1 如何设计9.2 完整的类9.3 测试9.3.1 测试展示功能 完整的代码–gitee链接 7. 数据管理模块 TODO: 读写锁?普通锁? 7.1 如何设计 需要管理…

Flink operator实现自动扩缩容

官网文档位置: 1.Autoscaler | Apache Flink Kubernetes Operator 2.Configuration | Apache Flink Kubernetes Operator 1.部署K8S集群 可参照我之前的文章k8s集群搭建 2.Helm安装Flink-Operator helm repo add flink-operator-repo https://downloads.apach…

使用LINUX的dd命令制作自己的img镜像

为了避免重复安装同一镜像,配置环境,首先我准备一个正常使用的完整系统。 使用Gparted软件先将母盘(如U盘,TF卡)分区调整为只有数据的大小。如:60G的TF卡,只用了3.5G,将未使用的空间…

【Unity3D】LOD Group 多细节层次(CrossFade淡出淡入效果)

新建一个空物体挂载LOD Group脚本 LOD0(球体) LOD1(立方体) LOD2(单面板Quad) 可发现我勾选了Cross Fade并没有渐隐效果,是因为Shader是不透明的,不支持。 经过如下修改后支持Cros…

【2025年最新】OpenWrt 更换国内源的指南(图形界面版)

在上一篇文章中我们讲解了如何使用命令行更换国内源,如果你没有终端工具,或者不喜欢命令行,那么图形界面方式将会是更简单有效的方式。 命令行版本:【2025年最新】OpenWrt 更换国内源的指南(命令行)-CSDN博客 为什么选择通过图形…

Jdk动态代理源码缓存优化比较(JDK17比JDK8)

目录 JDK 8的缓存实现 JDK 17的缓存实现 优化比较 总结实际应用影响 JDK 8的缓存实现 // JDK 8 private static final WeakCache<ClassLoader, Class<?>[], Class<?>> proxyClassCache new WeakCache<>(new KeyFactory(), new ProxyClassFact…

移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析

摘要&#xff1a;本文旨在探讨移动电商的崛起背景、特点及其对传统电商模式的革新影响&#xff0c;并以开源AI智能名片21链动模式S2B2C商城小程序为具体案例&#xff0c;深入分析其在移动电商领域的创新实践。随着移动互联网技术的飞速发展&#xff0c;移动电商已成为电商行业的…

【计算机网络】课程 实验三 跨交换机实现 VLAN 间路由

实验 3 跨交换机实现 VLAN 间路由 一、实验目的 1&#xff0e;理解跨交换机之间VLAN的特点。 2&#xff0e;掌握如何在交换机上划分基于端口的VLAN&#xff0c;给VLAN内添加端口。 3&#xff0e;利用三层交换机跨交换机实现 VLAN 间路由。 二、实验分析与设计 【背景描述…

计算机网络——数据链路层-介质访问控制

一、介质访问控制方法 在局域网中, 介质访问控制(medium access control)简称MAC&#xff0c;也就是信道访问控制方法&#xff0c;可以 简单的把它理解为如何控制网络节点何时发送数据、如何传输数据以及怎样在介质上接收数据&#xff0c; 是解决当局域网中共用信道的使用产生竞…

121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及时间复杂度的分析

目录 1.未优化的Hoare排序存在的问题 测试代码 "量身定制"的测试代码1 运行结果 "量身定制"的测试代码2 运行结果 "量身定制"的测试代码3 运行结果 分析代码1、2和3栈溢出的原因 排有序数组的分析 分析测试代码1:给一个升序数组,要求排…

【操作系统不挂科】操作系统期末考试卷<2>(单选题&简答题&计算与分析题&程序分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本章为系列题库&#xff0c;其他章节看下面传送门其他博客 【操作系统不挂科】&#xff1c;操作系统概论&#xff08;1&#xff09;&#xff1e…

解密人工智能:如何改变我们的工作与生活

引言&#xff1a;AI崛起背后的思考 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;从科幻小说中的神秘存在&#xff0c;逐渐走进了我们的日常生活。无论是智能手机的语音助手&#xff0c;还是推荐心仪商品的电商平台&#xff0c;AI技术已悄然融入工作与生活的…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…

Chapter 1 Understanding Large Language Models

文章目录 Understanding Large Language ModelsWhat is an LLM?Applications of LLMSStages of building and using LLMsUsing LLMS for different tasksA closer look at the GPT architectureBuilding a large language modelSummary Understanding Large Language Models …

游戏社交趋势下,游戏语音再升级!

如今&#xff0c;游戏已成为我们社交生活的一个重要娱乐方式&#xff0c;春节临近&#xff0c;与亲朋好友一起畅玩“开黑”无疑是节假日的一大乐趣。在游戏社交互动中&#xff0c;“游戏语音”不可或缺。在传统游戏语音领域&#xff0c;多人在线游戏如 MOBA、FPS 和 MMORPG 的实…

CTFshow—远程命令执行

29-35 Web29 代码利用正则匹配过滤了flag&#xff0c;后面加了/i所以不区分大小写。 可以利用通配符绕过 匹配任何字符串&#xff0f;文本&#xff0c;包括空字符串&#xff1b;*代表任意字符&#xff08;0个或多个&#xff09; ls file * ? 匹配任何一个字符&#xff08;不…