Day24:JWT 权限验证中间件 + 认证授权全套实战(笔记 + 面试题 + 落地步骤)
·
一、今日学习目标
- ASP.NET Core 认证、授权核心概念
- 配置 JWT 全局认证中间件
[Authorize]/[AllowAnonymous]使用- 角色认证、策略认证基础用法
- 接口自动鉴权:无 Token/Token 非法 / 过期 自动 401
- 完成:登录后带 Token 请求需要授权的接口
二、核心概念极简理解
1. 认证 Authentication(你是谁?)
校验 JWT 是否合法、是否过期、签名是否正确,解析出用户身份信息。
2. 授权 Authorization(你能干嘛?)
认证通过后,判断你有没有权限访问当前接口(角色、策略、资源)。
3. 两个特性
[Authorize]:必须登录带 Token 才能访问[AllowAnonymous]:匿名放行,不需要 Token
三、高频面试题 + 标准答案
1. 认证和授权有什么区别?
认证:校验身份,确认你是谁(JWT 验签、解析用户)。
授权:确认你能访问哪些接口(角色、权限、策略控制)。
2. [Authorize] 作用?
标识接口 / 控制器需要登录认证,请求必须携带合法 JWT Token,否则直接返回 401 未授权。
3. [AllowAnonymous] 作用?
跳过 JWT 认证,允许匿名访问,比如:登录、注册、验证码接口。
4. ASP.NET Core JWT 鉴权原理?
- 请求头携带
Authorization: Bearer Token - JWT 认证中间件自动拦截
- 验签、校验过期、解析载荷生成
ClaimsPrincipal - 后续授权、接口可获取当前登录用户信息
5. Token 过期、篡改会怎么样?
中间件自动校验失败,直接返回 401 Unauthorized,不会进入接口业务代码。
6. 为什么用 Bearer 前缀?
标准 HTTP 认证方案,标识这是Bearer 令牌,区分 Basic、Digest 等认证方式。
四、落地配置步骤(DDD 架构直接可用)
1. 先确保已安装 NuGet
Microsoft.IdentityModel.Tokens
System.IdentityModel.Tokens.Jwt
2. appsettings 保留 Jwt 配置
"Jwt": {
"Secret": "你的超长密钥字符串",
"Issuer": "Admin.API",
"Audience": "Admin.Client",
"ExpireMinutes": 120
}
3. Program.cs 注册 JWT 认证授权中间件
// 读取Jwt配置
var jwtSection = builder.Configuration.GetSection("Jwt");
var secretKey = jwtSection["Secret"]!;
var issuer = jwtSection["Issuer"]!;
var audience = jwtSection["Audience"]!;
// 添加认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// 校验签发者
ValidateIssuer = true,
// 校验受众
ValidateAudience = true,
// 校验过期时间
ValidateLifetime = true,
// 校验签名密钥
ValidateIssuerSigningKey = true,
ValidIssuer = issuer,
ValidAudience = audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
// 不允许时间偏移
ClockSkew = TimeSpan.Zero
};
});
// 启用授权
builder.Services.AddAuthorization();
4. 启用中间件顺序(必须按这个顺序)
// 先认证
app.UseAuthentication();
// 后授权
app.UseAuthorization();
顺序不能乱:认证 → 授权 → 路由
五、特性实际使用
1. 登录接口匿名放行
[HttpPost("login")]
[AllowAnonymous]
public async Task<ActionResult<R<LoginVo>>> Login([FromBody] LoginDto dto)
{
// ...
}
2. 整个控制器都需要登录
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class UserController : ControllerBase
{
// 所有接口都必须带Token
}
3. 单个接口需要登录
[HttpGet("page")]
[Authorize]
public async Task<ActionResult<...>> Page(...)
{
}
4. 角色认证(基础用法)
生成 JWT 时带入角色 Claim,接口限制角色:
[Authorize(Roles = "Admin")]
六、Postman 带 Token 请求方式
- 先调用登录接口,拿到
Token - 切换到 Authorization → Type 选 Bearer Token
- 把登录返回的 Token 粘贴进去
- 访问加了
[Authorize]的接口,正常通行 - 不带 Token / 乱填 Token / 过期 Token → 直接 401
七、今日练习任务
- 配置好 JWT 认证中间件,中间件顺序正确
- 登录接口加
[AllowAnonymous] - 用户分页、新增、修改接口加
[Authorize] - Postman 测试:
- 不带 Token 访问 → 401
- 带合法 Token 访问 → 正常返回
- 篡改 Token / 过期 Token → 401
- 学会从接口中获取当前登录用户 ID、账号
八、拓展:控制器中获取当前登录用户
// 获取用户ID
var userId = User.Claims.FirstOrDefault(c => c.Type == "UserId")?.Value;
// 获取登录账号
var account = User.Identity?.Name;更多推荐


所有评论(0)