在ASP.NET Core应用中,Cookie是存储在客户端浏览器中的小型数据片段,常用于维持用户会话、记录用户偏好设置等场景。掌握Cookie的读写和加密操作是C#后端开发的基础技能,下面详细介绍具体的实现方式。

基础环境准备
首先需要在ASP.NET Core项目中引入必要的基础依赖,默认创建的项目已经包含了Microsoft.AspNetCore.Http命名空间,该命名空间提供了操作Cookie的核心接口。如果是控制台程序需要操作Cookie,还需要额外引入相关HTTP上下文的模拟依赖,本文基于常规的ASP.NET Core Web应用展开说明。
写入Cookie
写入Cookie需要通过当前请求的HttpContext对象的Response.Cookies属性实现,核心方法是Append,可以指定Cookie的名称、值、过期时间等参数。
基础写入示例
以下代码演示了在控制器中写入一个简单的用户ID Cookie:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
namespace CookieDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CookieController : ControllerBase
{
[HttpPost("write")]
public IActionResult WriteCookie()
{
// 定义Cookie的名称和值
string cookieName = "userId";
string cookieValue = "10001";
// 设置Cookie选项,包括过期时间
CookieOptions options = new CookieOptions
{
// 过期时间为7天后
Expires = DateTime.Now.AddDays(7),
// 是否仅通过HTTP传输,避免JavaScript读取
HttpOnly = true,
// 是否仅在HTTPS下传输
Secure = false
};
// 写入Cookie
Response.Cookies.Append(cookieName, cookieValue, options);
return Ok("Cookie写入成功");
}
}
}
读取Cookie
读取Cookie需要通过HttpContext的Request.Cookies属性,它是一个键值对集合,通过Cookie名称即可获取对应的值。
基础读取示例
以下代码演示了读取刚才写入的userId Cookie:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
namespace CookieDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CookieController : ControllerBase
{
[HttpGet("read")]
public IActionResult ReadCookie()
{
string cookieName = "userId";
// 尝试获取Cookie值
string cookieValue = Request.Cookies[cookieName];
if (string.IsNullOrEmpty(cookieValue))
{
return NotFound("未找到对应的Cookie");
}
return Ok($"读取到的Cookie值:{cookieValue}");
}
}
}
加密Cookie
直接存储明文Cookie存在安全风险,比如用户ID被篡改可能导致越权问题,因此需要对Cookie值进行加密。ASP.NET Core提供了内置的数据保护接口IDataProtector来实现加密和解密操作。
配置数据保护服务
首先需要在Program.cs中注册数据保护服务,默认的Web应用已经包含了基础的服务注册,无需额外操作。如果需要自定义保护策略,可以额外配置:
var builder = WebApplication.CreateBuilder(args); // 添加数据保护服务,默认已包含,这里仅为示意 builder.Services.AddDataProtection(); builder.Services.AddControllers(); var app = builder.Build(); app.UseAuthorization(); app.MapControllers(); app.Run();
加密写入Cookie
以下代码演示了使用数据保护接口加密Cookie值后写入:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.DataProtection;
namespace CookieDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CookieController : ControllerBase
{
private readonly IDataProtector _protector;
// 通过依赖注入获取IDataProtectionProvider,创建保护器
public CookieController(IDataProtectionProvider provider)
{
// 指定保护器的用途标识,不同标识加密结果不同
_protector = provider.CreateProtector("CookieDemo.UserId");
}
[HttpPost("write-encrypt")]
public IActionResult WriteEncryptCookie()
{
string cookieName = "encryptUserId";
string originalValue = "10001";
// 加密原始值
string encryptedValue = _protector.Protect(originalValue);
CookieOptions options = new CookieOptions
{
Expires = DateTime.Now.AddDays(7),
HttpOnly = true,
Secure = false
};
Response.Cookies.Append(cookieName, encryptedValue, options);
return Ok("加密Cookie写入成功");
}
}
}
解密读取Cookie
读取加密后的Cookie时,需要使用同一个用途标识创建的保护器进行解密,否则会解密失败。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.DataProtection;
namespace CookieDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CookieController : ControllerBase
{
private readonly IDataProtector _protector;
public CookieController(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("CookieDemo.UserId");
}
[HttpGet("read-encrypt")]
public IActionResult ReadEncryptCookie()
{
string cookieName = "encryptUserId";
string encryptedValue = Request.Cookies[cookieName];
if (string.IsNullOrEmpty(encryptedValue))
{
return NotFound("未找到加密Cookie");
}
try
{
// 解密Cookie值
string originalValue = _protector.Unprotect(encryptedValue);
return Ok($"解密后的Cookie值:{originalValue}");
}
catch (Exception ex)
{
return BadRequest($"Cookie解密失败:{ex.Message}");
}
}
}
}
注意事项
- Cookie的大小限制一般为4KB左右,不要存储过大的数据。
- 涉及用户敏感信息的Cookie建议开启
HttpOnly和Secure属性,提升安全性。 - 加密Cookie时,保护器的用途标识需要保持一致,否则无法正确解密。
- 如果应用部署在多台服务器上,需要配置数据保护的持久化和共享策略,否则不同服务器的加密结果无法互相解密。
C#ASP.NET_CoreCookie加密Cookie修改时间:2026-06-15 16:24:32