首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ASP.NET Core Minimal API 里的 Session、Cookie、JWT

ASP.NET Core Minimal API 里的 Session、Cookie、JWT

原创
作者头像
步步为营DotNet
发布于 2026-07-09 14:42:35
发布于 2026-07-09 14:42:35
2260
举报

一、为什么你明明会写接口,却总被认证搞糊涂?

如果你刚学 Minimal API,你会发现:

写接口并不难:

代码语言:javascript
复制
 app.MapGet("/hello", () => "hello");

但只要一涉及登录、权限、认证,很多概念马上就混在一起:

  • Session 是不是登录?
  • Cookie 是不是 Session?
  • JWT 是不是比 Cookie 高级?
  • 为什么有的人说后台系统用 Cookie?
  • 为什么前后端分离常用 JWT?
  • Minimal API 里到底该怎么配?
  • .RequireAuthorization() 到底是靠什么工作的?

很多初学者最大的痛苦不是代码不会写,而是:

概念分不清,所以代码只是“抄会了”,并没有“理解了”。

这篇文章我就按 由浅入深 的方式,把最常见的 3 个东西讲透:

  • Session
  • Cookie
  • JWT

并且重点围绕 ASP.NET Core Minimal API 来讲,不讲空理论。


二、先别急着看代码,先搞懂最本质的问题


2.1 什么叫“用户登录”?

假设你做了一个系统:

  • /login 登录
  • /me 获取当前用户信息
  • /orders 查看订单
  • /admin 管理员接口

现在有个问题:

用户第一次调用 /login 时,后端知道这是他。

但是用户第二次调用 /me 时,后端凭什么还知道是他?

因为 HTTP 有一个非常重要的特点:

HTTP 是无状态的。


2.2 什么叫“HTTP 无状态”?

无状态的意思是:

服务器默认不会自动记住上一次请求是谁发的。

也就是说,这两次请求在服务器看来,本来是两件独立的事:

代码语言:javascript
复制
 POST /login
 GET /me

如果没有额外机制,服务器根本不知道:

  • 这两个请求是不是同一个人
  • 这个人是否已经登录过
  • 这个人是不是管理员

所以,“登录系统”的本质,就是在解决这个问题:

如何让后续请求能够证明:我就是刚才那个已经登录成功的人。

这就是认证系统存在的意义。


三、先理解认证和授权,不然后面一定会混

这是所有初学者都必须先分清的两个词。


3.1 认证 Authentication

认证只解决一个问题:

你是谁?

比如:

  • 你是不是已登录用户?
  • 你是不是张三?
  • 你是不是管理员账号对应的人?
  • 你是不是某个内部服务?

3.2 授权 Authorization

授权解决的是另一个问题:

你能做什么?

比如:

  • 普通用户能看自己的订单
  • 管理员能删用户
  • 财务能导出报表
  • 内部服务能调用某个接口

3.3 最重要的一句话

你一定要先记住:

代码语言:javascript
复制
 认证:你是谁
 授权:你能做什么

并且顺序必须是:

代码语言:javascript
复制
 先认证,再授权

因为系统连“你是谁”都没确认,就不可能判断“你有没有权限”。


四、用一个生活例子,把登录这件事彻底想明白

假设你去酒店入住。

第一步:前台确认你是谁

你出示身份证,前台确认:

  • 你是不是预定的人
  • 你是不是本人

这一步就是 认证。

第二步:给你一张房卡

前台给你一张房卡,房卡上记录了你的入住信息。

以后你再进酒店房间,不需要每次都重新拿身份证,只要刷房卡。

这一步很像:

登录成功后,系统给你一个“凭证”

以后你带着凭证来,系统就能认出你。

这个“凭证”,在 Web 世界里常见的表现方式就是:

  • SessionId
  • Cookie 里的认证票据
  • JWT Token

五、先讲最基础的:Cookie 到底是什么?

很多初学者一上来就被 JWT 吸引,但如果你连 Cookie 都没搞懂,JWT 也很难真的理解。


5.1 Cookie 是浏览器保存的一小段数据

Cookie 本质上就是:

服务器让浏览器帮忙保存的一小段文本数据。

比如服务器响应时告诉浏览器:

代码语言:javascript
复制
 Set-Cookie: UserName=alice

浏览器就会把它记住。

之后浏览器再访问这个网站时,会自动带上:

代码语言:javascript
复制
 Cookie: UserName=alice

所以 Cookie 你可以理解成:

浏览器替你保管的一张小纸条。


5.2 Cookie 的特点

Cookie 有几个很重要的特点:

1)它存在浏览器里

是客户端保存的。

2)浏览器会自动带上

只要满足域名、路径等条件,请求时浏览器会自动把它带给服务器。

3)它只是“存数据的载体”

Cookie 本身不是登录方案,也不是权限系统。

它只是:

浏览器帮服务器保存和回传数据的一种机制。


5.3 一个最简单的 Cookie 示例

在 Minimal API 中,你可以直接操作 Cookie。

代码语言:javascript
复制
 var builder = WebApplication.CreateBuilder(args);
 var app = builder.Build();
 ​
 // 写 Cookie
 app.MapGet("/set-cookie", (HttpContext context) =>
 {
     context.Response.Cookies.Append("UserName", "alice");
     return "Cookie 已写入";
 });
 ​
 // 读 Cookie
 app.MapGet("/get-cookie", (HttpContext context) =>
 {
     var name = context.Request.Cookies["UserName"];
     return $"Cookie 中的 UserName = {name}";
 });
 ​
 app.Run();

5.4 这段代码说明了什么?

它说明:

  • 服务器可以往浏览器写 Cookie
  • 浏览器以后会自动带回这个 Cookie
  • 服务器可以再读取它

但请注意:

这还不是认证。

这只是“写了一个普通 Cookie”。

你不能因为 Cookie 里写了 UserName=alice,就认为这是一个安全的登录系统。

为什么?

因为用户理论上可以伪造、篡改普通 Cookie。

所以,真正的登录认证,不能只是“随便写个 Cookie”。

这就引出了下一步:

Cookie Authentication


六、Session 到底是什么?

现在我们来讲 Session。

这是很多人最容易误解的概念。


6.1 Session 可以理解为“服务端会话记录”

如果说 Cookie 是浏览器上的小纸条,那 Session 可以理解成:

服务器端的一份会话档案。

比如你第一次访问网站时,服务器做两件事:

  1. 给你分配一个编号:abc123
  2. 在服务器内存/Redis/数据库里记一条记录:
代码语言:javascript
复制
 abc123 -> 当前用户 alice,验证码 9527,购物车 3 件商品

然后服务器把这个编号 abc123 发给浏览器保存。

浏览器下次再来时,把这个编号带回来,服务器一查,就知道你的会话数据了。


6.2 Session 的本质

Session 的核心思想是:

真正的数据保存在服务器,客户端只保存一个“会话编号”。

所以你可以这么记:

  • Cookie:客户端存数据
  • Session:服务端存数据
  • 常见组合:客户端通过 Cookie 带一个 SessionId,服务端通过 SessionId 找 Session 数据

6.3 为什么 Session 不是认证方式本身?

这是最关键的一点。

Session 能帮助你“记住状态”,但它本身不是 ASP.NET Core 标准认证体系中的认证方案。

你当然可以自己这样做:

代码语言:javascript
复制
 context.Session.SetString("UserId", "1001");

然后每次请求都检查:

代码语言:javascript
复制
 var userId = context.Session.GetString("UserId");
 if (userId == null) return Unauthorized();

这能不能跑?

能。

但这叫:

自己手搓登录状态判断

而不是标准认证体系。

它的问题是:

  • 每个接口都可能要手动判断
  • 角色、权限扩展麻烦
  • .RequireAuthorization() 用不上
  • 不容易和统一授权策略集成
  • 多系统、多实例扩展困难

所以你可以把 Session 理解成:

保存会话状态的机制,不是现代 ASP.NET Core 推荐的主认证方案。


6.4 Session 最适合干什么?

Session 更适合存:

  • 验证码
  • 多步骤表单临时数据
  • 购物车草稿
  • 登录前临时跳转地址
  • 用户本次访问的临时状态

不太推荐用来手工维护整个登录认证体系。


6.5 Minimal API 中使用 Session

代码示例

代码语言:javascript
复制
 var builder = WebApplication.CreateBuilder(args);
 ​
 // Session 依赖缓存
 builder.Services.AddDistributedMemoryCache();
 ​
 builder.Services.AddSession(options =>
 {
     options.Cookie.Name = ".demo.session";
     options.IdleTimeout = TimeSpan.FromMinutes(20);
     options.Cookie.HttpOnly = true;
 });
 ​
 var app = builder.Build();
 ​
 app.UseSession();
 ​
 // 写 Session
 app.MapGet("/session/set", (HttpContext context) =>
 {
     context.Session.SetString("Code", "9527");
     return "Session 已写入";
 });
 ​
 // 读 Session
 app.MapGet("/session/get", (HttpContext context) =>
 {
     var code = context.Session.GetString("Code");
     return $"Session 中的 Code = {code}";
 });
 ​
 app.Run();

6.6 这段代码背后的流程

访问 /session/set 时:

代码语言:javascript
复制
 context.Session.SetString("Code", "9527");

ASP.NET Core 会:

  1. 创建或找到当前 Session
  2. 把 Code=9527 存入 Session 数据
  3. 给浏览器一个 SessionId Cookie

以后浏览器访问 /session/get 时:

  1. 浏览器自动带上 SessionId Cookie
  2. 服务器通过 SessionId 找到对应 Session 数据
  3. 读出 Code=9527

6.7 Session 的优缺点

优点

  • 好理解
  • 适合存临时状态
  • 数据在服务端,相对可控

缺点

  • 服务端要保存状态
  • 多机部署时要共享 Session
  • 不适合纯 API / 前后端分离
  • 不适合作为现代统一认证的核心方式

七、Cookie Authentication 是什么?这才是 Web 登录的关键

前面我们讲了普通 Cookie,也讲了 Session。

现在终于来到 .NET 里真正常见的浏览器认证方案:

Cookie Authentication


7.1 普通 Cookie 和 Cookie Authentication 不一样

普通 Cookie 是:

我手动往浏览器里写一点数据

例如:

代码语言:javascript
复制
 context.Response.Cookies.Append("UserName", "alice");

这只是写数据。

而 Cookie Authentication 是:

ASP.NET Core 官方提供的标准认证机制,它会把“认证票据”写到 Cookie 中。

注意关键词:

认证票据

它不是简单写一个用户名,而是写入一份由框架保护过的身份信息,然后后续请求能自动恢复出当前用户。


7.2 Cookie Authentication 解决了什么问题?

它解决的是:

  • 用户登录成功后如何保存身份
  • 后续请求如何恢复身份
  • 如何让 HttpContext.User 自动有值
  • 如何和 .RequireAuthorization() 配合
  • 如何退出登录

换句话说,Cookie Authentication 不是“存值工具”,而是:

ASP.NET Core 里一套完整的浏览器登录认证方案。


7.3 Cookie Authentication 的工作原理

流程大概是这样的:

代码语言:javascript
复制
 1. 用户提交用户名密码
 2. 后端校验账号密码
 3. 后端创建 ClaimsPrincipal(用户身份对象)
 4. 调用 SignInAsync
 5. ASP.NET Core 生成加密/签名后的认证票据,写入 Cookie
 6. 浏览器以后每次请求自动带上这个 Cookie
 7. ASP.NET Core 从 Cookie 中还原出用户身份
 8. 当前请求的 HttpContext.User 就有值了
 9. RequireAuthorization() 根据用户身份判断是否允许访问

7.4 什么是 ClaimsPrincipal?

这是 .NET 认证体系中的核心对象。

你可以简单理解成:

当前登录用户的身份对象

里面会有:

  • 用户名
  • 用户Id
  • 角色
  • 权限
  • 租户信息
  • 邮箱等 Claim

比如:

代码语言:javascript
复制
 new Claim(ClaimTypes.Name, "alice")
 new Claim(ClaimTypes.Role, "admin")
 new Claim("user_id", "1001")

这些 Claim 最终会组成一个 ClaimsPrincipal。


7.5 Minimal API 中 Cookie Authentication 完整示例

下面给一个可以直接理解的例子。

代码语言:javascript
复制
 using System.Security.Claims;
 using Microsoft.AspNetCore.Authentication.Cookies;
 ​
 var builder = WebApplication.CreateBuilder(args);
 ​
 // 1. 注册认证:默认使用 Cookie 认证
 builder.Services
     .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
     .AddCookie(options =>
     {
         options.Cookie.Name = "demo_auth_cookie";
 ​
         // 对 API 来说,不要跳转到登录页,直接返回 401
         options.Events.OnRedirectToLogin = context =>
         {
             context.Response.StatusCode = StatusCodes.Status401Unauthorized;
             return Task.CompletedTask;
         };
     });
 ​
 // 2. 注册授权
 builder.Services.AddAuthorization();
 ​
 var app = builder.Build();
 ​
 // 3. 启用认证和授权中间件
 app.UseAuthentication();
 app.UseAuthorization();
 ​
 // 公开接口
 app.MapGet("/", () => "任何人都能访问");
 ​
 // 登录接口
 app.MapPost("/login", async (HttpContext context) =>
 {
     // 实际项目里这里应该校验数据库用户名密码
     var claims = new List<Claim>
     {
         new Claim(ClaimTypes.Name, "alice"),
         new Claim(ClaimTypes.Role, "admin"),
         new Claim("user_id", "1001")
     };
 ​
     var identity = new ClaimsIdentity(
         claims,
         CookieAuthenticationDefaults.AuthenticationScheme);
 ​
     var principal = new ClaimsPrincipal(identity);
 ​
     await context.SignInAsync(
         CookieAuthenticationDefaults.AuthenticationScheme,
         principal);
 ​
     return Results.Ok("登录成功");
 });
 ​
 // 当前用户信息
 app.MapGet("/me", (ClaimsPrincipal user) =>
 {
     return Results.Ok(new
     {
         IsAuthenticated = user.Identity?.IsAuthenticated,
         Name = user.Identity?.Name,
         Claims = user.Claims.Select(c => new { c.Type, c.Value })
     });
 }).RequireAuthorization();
 ​
 // 退出登录
 app.MapPost("/logout", async (HttpContext context) =>
 {
     await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
     return Results.Ok("已退出登录");
 });
 ​
 app.Run();

7.6 这段代码你一定要看懂的 4 个点

第 1 点:AddAuthentication().AddCookie()

表示:

系统要启用 Cookie 认证方案。


第 2 点:SignInAsync

表示:

当前用户登录成功,请把他的身份写入认证 Cookie。


第 3 点:HttpContext.User

在用户后续请求时,ASP.NET Core 会自动从认证 Cookie 里恢复用户身份,所以这里能拿到用户信息。


第 4 点:.RequireAuthorization()

表示:

这个接口只有“已经通过认证”的用户才能访问。


7.7 Cookie Authentication 适合什么场景?

它最适合:

  • 浏览器访问的网站
  • 后台管理系统
  • 企业内部系统
  • MVC / Razor / Minimal API 的 Web 场景

为什么?

因为浏览器会自动带 Cookie,所以体验自然。


7.8 Cookie Authentication 的缺点

它也不是万能的。

缺点 1:浏览器特性强

它天然更适合浏览器,不太适合 App、小程序、第三方调用。

缺点 2:要注意 CSRF

因为浏览器会自动带 Cookie,所以要防跨站请求伪造。


八、JWT 是什么?为什么前后端分离总在讲它?

现在我们再来讲 JWT。

当你理解了 Cookie Authentication,你就会发现 JWT 其实只是另一种“携带身份凭证”的方式。


8.1 JWT 可以先理解成“登录令牌”

JWT 全称是:

JSON Web Token

你可以暂时把它理解成:

服务器签发给客户端的一张“令牌”

客户端以后每次请求时,都主动带着这张令牌,告诉服务器:

你看,我已经登录过了,这是我的身份证明。


8.2 JWT 和 Cookie Authentication 的核心差别

Cookie Authentication

  • 登录后,身份票据放在 Cookie 里
  • 浏览器自动带上

JWT

  • 登录后,服务器返回一个 Token 字符串
  • 客户端自己保存
  • 请求时手动放到 Header 中

例如:

代码语言:javascript
复制
 Authorization: Bearer eyJhbGciOi...

8.3 JWT 的结构可以简单理解为什么?

JWT 看起来像这样:

代码语言:javascript
复制
 xxxxx.yyyyy.zzzzz

它通常由三部分组成:

  • Header:头部
  • Payload:载荷(里面有用户信息、过期时间等)
  • Signature:签名(防篡改)

JWT 里带着用户身份信息,并且有签名,服务器可以验证它有没有被伪造。


8.4 JWT 的工作原理

流程如下:

代码语言:javascript
复制
 1. 用户提交用户名密码
 2. 服务器校验成功
 3. 服务器生成一个 JWT
 4. 把 JWT 返回给客户端
 5. 客户端保存 JWT
 6. 后续每次请求,把 JWT 放进 Authorization 头
 7. 服务器校验 JWT 是否有效
 8. 如果有效,就恢复出当前用户身份

8.5 为什么前后端分离常用 JWT?

因为在前后端分离场景中:

  • 前端可能是 Vue / React
  • 后端只是 API
  • 不一定是传统浏览器页面跳转
  • 可能还要支持 App、小程序、第三方系统

这时候让客户端自己在 Header 中带 Token,会比依赖浏览器 Cookie 更灵活。

所以 JWT 常见于:

  • SPA 前后端分离
  • App
  • 小程序
  • 开放 API
  • 微服务调用

8.6 Minimal API 中 JWT 完整示例

先安装包:

代码语言:javascript
复制
 dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

然后写代码:

代码语言:javascript
复制
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
 using System.Text;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.IdentityModel.Tokens;
 ​
 var builder = WebApplication.CreateBuilder(args);
 ​
 var secretKey = "this_is_demo_secret_key_123456789_123456";
 var issuer = "minimal-api-demo";
 var audience = "minimal-api-client";
 ​
 // 1. 注册 JWT 认证
 builder.Services
     .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
     .AddJwtBearer(options =>
     {
         options.TokenValidationParameters = new TokenValidationParameters
         {
             ValidateIssuer = true,
             ValidIssuer = issuer,
 ​
             ValidateAudience = true,
             ValidAudience = audience,
 ​
             ValidateIssuerSigningKey = true,
             IssuerSigningKey = new SymmetricSecurityKey(
                 Encoding.UTF8.GetBytes(secretKey)),
 ​
             ValidateLifetime = true
         };
     });
 ​
 // 2. 注册授权
 builder.Services.AddAuthorization();
 ​
 var app = builder.Build();
 ​
 app.UseAuthentication();
 app.UseAuthorization();
 ​
 // 登录接口:生成 JWT
 app.MapPost("/login", () =>
 {
     var claims = new List<Claim>
     {
         new Claim(ClaimTypes.Name, "alice"),
         new Claim(ClaimTypes.Role, "admin"),
         new Claim("user_id", "1001")
     };
 ​
     var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
     var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 ​
     var token = new JwtSecurityToken(
         issuer: issuer,
         audience: audience,
         claims: claims,
         expires: DateTime.UtcNow.AddMinutes(30),
         signingCredentials: credentials);
 ​
     var jwt = new JwtSecurityTokenHandler().WriteToken(token);
 ​
     return Results.Ok(new
     {
         access_token = jwt
     });
 });
 ​
 // 受保护接口
 app.MapGet("/me", (ClaimsPrincipal user) =>
 {
     return Results.Ok(new
     {
         IsAuthenticated = user.Identity?.IsAuthenticated,
         Name = user.Identity?.Name,
         Claims = user.Claims.Select(c => new { c.Type, c.Value })
     });
 }).RequireAuthorization();
 ​
 app.Run();

8.7 这段 JWT 代码你要看懂什么?

第 1 步:登录成功后生成 Token

代码语言:javascript
复制
 var token = new JwtSecurityToken(...)

表示创建一个 JWT,里面放了用户 Claim 和过期时间。


第 2 步:返回给客户端

代码语言:javascript
复制
 return Results.Ok(new { access_token = jwt });

表示后端把登录令牌返回给前端。


第 3 步:前端以后访问接口时要带它

请求头示意:

代码语言:javascript
复制
 Authorization: Bearer 你的token

第 4 步:后端自动验证

JWT Bearer 中间件会自动:

  • 验证签名
  • 验证是否过期
  • 验证发行者
  • 验证接收者

验证通过后,把用户身份放到 HttpContext.User。


九、Cookie Authentication 和 JWT,到底谁更好?

这是新手非常爱问的问题。

但正确答案不是“谁更高级”,而是:

谁更适合当前场景。


9.1 Cookie Authentication 更适合什么?

更适合:

  • 浏览器网站
  • 后台管理系统
  • 企业内部系统
  • 服务端渲染页面
  • 以浏览器访问为主的 Minimal API

因为浏览器自动带 Cookie,使用体验非常自然。


9.2 JWT 更适合什么?

更适合:

  • 前后端分离
  • App
  • 小程序
  • 第三方调用
  • 开放 API
  • 微服务接口

因为它和客户端类型解耦,不依赖浏览器自动带 Cookie。


9.3 它们都能做认证,但风格不同

Cookie Authentication 更像:

浏览器“自动带工牌”

JWT 更像:

客户端“每次主动出示令牌”


十、Session、Cookie、Cookie Authentication、JWT 的关系图

这是最容易混的地方,我们专门理一遍。


10.1 普通 Cookie

浏览器存一小段数据。


10.2 Session

服务端存一份会话数据,通常浏览器通过 Cookie 带一个 SessionId 来找到它。


10.3 Cookie Authentication

ASP.NET Core 官方认证方案。 它把认证票据写进 Cookie,后续请求自动恢复用户身份。


10.4 JWT

服务器签发 Token,客户端自己保存,请求时手动带上。


十一、最关键的对比表:你一定要反复看

项目

Session

普通 Cookie

Cookie Authentication

JWT

是什么

服务端会话数据机制

浏览器保存数据的机制

ASP.NET Core 标准认证方案

Token 认证方案

数据主要存哪

服务端

客户端浏览器

认证票据通常在客户端 Cookie

客户端

是否是“认证方案”

不是

不是

是

是

浏览器会不会自动带

SessionId 通常会自动带

会

会

不会,需手动放 Header

适合浏览器网站

可以辅助

一般

很适合

可以,但未必最优

适合前后端分离

不适合

不适合

一般

很适合

适合 App / 小程序

不适合

不适合

一般

很适合

是否依赖服务端存状态

是

否

通常较少依赖

否

在 .NET 中是否有标准支持

有

有

有

有


十二、如果我是小白,我到底该怎么选?

直接给你最实用的结论。


12.1 你做的是后台管理系统、企业内部网站

优先选:

Cookie Authentication

理由:

  • 浏览器访问为主
  • 配置简单
  • 和 ASP.NET Core 授权体系配合最好
  • 用户体验自然

12.2 你做的是 Vue / React 前后端分离 + Minimal API

优先选:

JWT

理由:

  • 前端和后端完全分离
  • 前端自己带 Token 更灵活
  • 适合多终端

12.3 你只是想存验证码、购物车、临时状态

用:

Session

但别把它当成完整认证方案。


十三、Minimal API 中这几个配置到底是什么意思?

很多人照着写,但不知道为什么。

我用最直白的话解释。


13.1 builder.Services.AddAuthentication()

意思是:

我要启用 ASP.NET Core 认证系统。


13.2 .AddCookie() / .AddJwtBearer()

意思是:

我要告诉框架,用哪种方式来识别当前用户。

  • AddCookie():通过 Cookie 认证
  • AddJwtBearer():通过 Bearer Token 认证

13.3 builder.Services.AddAuthorization()

意思是:

我要启用授权系统,这样才能用 .RequireAuthorization()。


13.4 app.UseAuthentication()

意思是:

每次请求进来时,先尝试识别当前用户是谁。


13.5 app.UseAuthorization()

意思是:

在识别出用户之后,再判断他有没有权限访问接口。


13.6 .RequireAuthorization()

意思是:

这个接口必须是已经认证通过的用户才能访问。


十四、三个典型场景,帮你彻底代入理解


场景 1:验证码接口

你发送短信验证码后,想把验证码临时存起来。

适合:

Session

因为这是临时状态,不是标准登录身份。


场景 2:后台管理系统

管理员在浏览器中登录,之后点击各种页面和接口。

适合:

Cookie Authentication

因为浏览器自动带 Cookie,最自然。


场景 3:Vue 前端 + Minimal API 后端

前端登录后拿到 Token,之后调用所有 API。

适合:

JWT

因为前后端分离,前端自己控制 Header 更灵活。


十五、常见误区,一次帮你纠正


误区 1:Session 就是登录

错。

Session 是会话数据机制,不是标准认证方案。


误区 2:Cookie 就是认证

错。

普通 Cookie 只是存数据。 只有 Cookie Authentication 才是标准认证方案。


误区 3:JWT 一定比 Cookie 更高级

错。

JWT 不是更高级,只是更适合前后端分离和多终端场景。

如果你是浏览器后台系统,Cookie Authentication 往往更合适。


误区 4:用了 Session 就能直接 .RequireAuthorization()

错。

.RequireAuthorization() 依赖 ASP.NET Core 认证体系,不是看你 Session 里有没有 UserId。


十六、避坑要点


16.1 UseAuthentication() 要在 UseAuthorization() 前面

必须这样写:

代码语言:javascript
复制
 app.UseAuthentication();
 app.UseAuthorization();

因为要先知道“你是谁”,才能判断“你能不能访问”。


16.2 Session 在生产环境别只用内存

开发环境可以:

代码语言:javascript
复制
 AddDistributedMemoryCache()

但生产环境多实例部署时,最好用 Redis 等共享存储。


16.3 Cookie Authentication 更适合浏览器,不代表永远都选它

如果你是 App、小程序、开放 API,就别硬上 Cookie。


16.4 JWT 要设置过期时间

不要发一个永不过期的 JWT。

最起码要有过期时间,后续再学 RefreshToken。


十七、最后总结:用最朴素的话把它们记住

如果你现在还是有点乱,我用最白话的方式再总结一次。


Session 是什么?

服务端帮你存一份会话数据,浏览器通常只带一个编号回来。

适合存临时状态,不推荐手搓完整登录系统。


普通 Cookie 是什么?

浏览器保存的一小段数据,请求时会自动带上。

它只是载体,不是完整认证方案。


Cookie Authentication 是什么?

ASP.NET Core 官方提供的浏览器登录认证机制,它把认证票据写进 Cookie。

适合后台系统、企业网站、浏览器场景。


JWT 是什么?

服务器签发给客户端的令牌,客户端以后每次请求主动带上。

适合前后端分离、App、小程序、开放 API。


十八、给小白的最终选择建议

如果你现在就要做项目,可以按这个最简单标准来:

如果你的项目是浏览器后台系统

选:

代码语言:javascript
复制
 Cookie Authentication

如果你的项目是前后端分离 API

选:

代码语言:javascript
复制
 JWT

如果你只是要存临时会话数据

选:

代码语言:javascript
复制
 Session

如果你问“Session 能不能做登录”

答案是:

代码语言:javascript
复制
 能手搓,但不推荐。现代 ASP.NET Core 更推荐 Cookie Authentication 或 JWT。

十九、一张最终总表收尾

场景

推荐方案

验证码、购物车、临时流程状态

Session

浏览器后台、企业内部系统

Cookie Authentication

Vue / React 前后端分离

JWT

App / 小程序

JWT

传统 Web 登录

Cookie Authentication

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、为什么你明明会写接口,却总被认证搞糊涂?
  • 二、先别急着看代码,先搞懂最本质的问题
    • 2.1 什么叫“用户登录”?
    • 2.2 什么叫“HTTP 无状态”?
  • 三、先理解认证和授权,不然后面一定会混
    • 3.1 认证 Authentication
    • 3.2 授权 Authorization
    • 3.3 最重要的一句话
  • 四、用一个生活例子,把登录这件事彻底想明白
    • 第一步:前台确认你是谁
    • 第二步:给你一张房卡
  • 五、先讲最基础的:Cookie 到底是什么?
    • 5.1 Cookie 是浏览器保存的一小段数据
    • 5.2 Cookie 的特点
      • 1)它存在浏览器里
      • 2)浏览器会自动带上
      • 3)它只是“存数据的载体”
    • 5.3 一个最简单的 Cookie 示例
    • 5.4 这段代码说明了什么?
  • 六、Session 到底是什么?
    • 6.1 Session 可以理解为“服务端会话记录”
    • 6.2 Session 的本质
    • 6.3 为什么 Session 不是认证方式本身?
    • 6.4 Session 最适合干什么?
    • 6.5 Minimal API 中使用 Session
      • 代码示例
    • 6.6 这段代码背后的流程
    • 6.7 Session 的优缺点
      • 优点
      • 缺点
  • 七、Cookie Authentication 是什么?这才是 Web 登录的关键
    • 7.1 普通 Cookie 和 Cookie Authentication 不一样
    • 7.2 Cookie Authentication 解决了什么问题?
    • 7.3 Cookie Authentication 的工作原理
    • 7.4 什么是 ClaimsPrincipal?
    • 7.5 Minimal API 中 Cookie Authentication 完整示例
    • 7.6 这段代码你一定要看懂的 4 个点
      • 第 1 点:AddAuthentication().AddCookie()
      • 第 2 点:SignInAsync
      • 第 3 点:HttpContext.User
      • 第 4 点:.RequireAuthorization()
    • 7.7 Cookie Authentication 适合什么场景?
    • 7.8 Cookie Authentication 的缺点
      • 缺点 1:浏览器特性强
      • 缺点 2:要注意 CSRF
  • 八、JWT 是什么?为什么前后端分离总在讲它?
    • 8.1 JWT 可以先理解成“登录令牌”
    • 8.2 JWT 和 Cookie Authentication 的核心差别
      • Cookie Authentication
      • JWT
    • 8.3 JWT 的结构可以简单理解为什么?
    • 8.4 JWT 的工作原理
    • 8.5 为什么前后端分离常用 JWT?
    • 8.6 Minimal API 中 JWT 完整示例
    • 8.7 这段 JWT 代码你要看懂什么?
      • 第 1 步:登录成功后生成 Token
      • 第 2 步:返回给客户端
      • 第 3 步:前端以后访问接口时要带它
      • 第 4 步:后端自动验证
  • 九、Cookie Authentication 和 JWT,到底谁更好?
    • 9.1 Cookie Authentication 更适合什么?
    • 9.2 JWT 更适合什么?
    • 9.3 它们都能做认证,但风格不同
  • 十、Session、Cookie、Cookie Authentication、JWT 的关系图
    • 10.1 普通 Cookie
    • 10.2 Session
    • 10.3 Cookie Authentication
    • 10.4 JWT
  • 十一、最关键的对比表:你一定要反复看
  • 十二、如果我是小白,我到底该怎么选?
    • 12.1 你做的是后台管理系统、企业内部网站
    • 12.2 你做的是 Vue / React 前后端分离 + Minimal API
    • 12.3 你只是想存验证码、购物车、临时状态
  • 十三、Minimal API 中这几个配置到底是什么意思?
    • 13.1 builder.Services.AddAuthentication()
    • 13.2 .AddCookie() / .AddJwtBearer()
    • 13.3 builder.Services.AddAuthorization()
    • 13.4 app.UseAuthentication()
    • 13.5 app.UseAuthorization()
    • 13.6 .RequireAuthorization()
  • 十四、三个典型场景,帮你彻底代入理解
    • 场景 1:验证码接口
    • 场景 2:后台管理系统
    • 场景 3:Vue 前端 + Minimal API 后端
  • 十五、常见误区,一次帮你纠正
    • 误区 1:Session 就是登录
    • 误区 2:Cookie 就是认证
    • 误区 3:JWT 一定比 Cookie 更高级
    • 误区 4:用了 Session 就能直接 .RequireAuthorization()
  • 十六、避坑要点
    • 16.1 UseAuthentication() 要在 UseAuthorization() 前面
    • 16.2 Session 在生产环境别只用内存
    • 16.3 Cookie Authentication 更适合浏览器,不代表永远都选它
    • 16.4 JWT 要设置过期时间
  • 十七、最后总结:用最朴素的话把它们记住
    • Session 是什么?
    • 普通 Cookie 是什么?
    • Cookie Authentication 是什么?
    • JWT 是什么?
  • 十八、给小白的最终选择建议
    • 如果你的项目是浏览器后台系统
    • 如果你的项目是前后端分离 API
    • 如果你只是要存临时会话数据
    • 如果你问“Session 能不能做登录”
  • 十九、一张最终总表收尾
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档