知识文档:从零到一实现 .NET Core 项目 + JWT 认证
1. 知识点概述
本项目通过实现 JWT 身份验证,完成以下功能:
- 用户登录并生成 JWT Token。
- 使用
[Authorize]
属性保护受控资源。 - 测试登录和受保护资源访问的完整流程。
JWT(JSON Web Token)是一种轻量级的认证机制,广泛用于分布式系统中的用户身份验证。JWT 包含三部分:
- Header:描述签名算法和类型。
- Payload:存储用户信息(如用户 ID、角色等)。
- Signature:对 Header 和 Payload 的加密签名。
2. 实现步骤
(1) 创建项目
dotnet new webapi -n JwtAuthDemo
cd JwtAuthDemo
- 创建一个新的 Web API 项目。
- 进入项目目录。
(2) 安装必要的 NuGet 包
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package Microsoft.IdentityModel.Tokens
dotnet add package System.IdentityModel.Tokens.Jwt
- 添加 JWT 相关依赖包。
3. 配置 JWT 身份验证
(1) 修改 appsettings.json
文件
{"Jwt": {"Key": "your_secret_key_must_be_long_enough", // 密钥,至少 16 字符"Issuer": "https://localhost:5001", // 签发者"Audience": "https://localhost:5001" // 接收者},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}
- 配置 JWT 的密钥、签发者和接收者。
(2) 在 Program.cs
中配置 JWT
var builder = WebApplication.CreateBuilder(args);// 获取JWT设置
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]); // 将密钥字符串转换为字节数组// 添加身份验证服务
builder.Services.AddAuthentication(options =>
{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; // 设置默认的身份验证方案options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; // 设置默认的挑战方案
})
.AddJwtBearer(options =>
{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true, // 验证签发者ValidateAudience = true, // 验证接收者ValidateLifetime = true, // 验证Token是否过期ValidateIssuerSigningKey = true, // 验证签名密钥ValidIssuer = jwtSettings["Issuer"], // 指定合法签发者ValidAudience = jwtSettings["Audience"],// 指定合法接收者IssuerSigningKey = new SymmetricSecurityKey(key) // 指定签名密钥};
});builder.Services.AddControllers();var app = builder.Build();// 启用身份验证中间件
app.UseAuthentication(); // 解析请求中的JWT
app.UseAuthorization(); // 检查用户是否有权限访问资源app.MapControllers();app.Run();
AddAuthentication
:启用身份验证服务。TokenValidationParameters
:定义 JWT 的验证规则。UseAuthentication
和UseAuthorization
:启用身份验证和授权中间件。
4. 创建用户模型
在 Models
文件夹中创建 UserModel.cs
:
namespace JwtAuthDemo.Models
{public class UserModel{public string Username { get; set; } // 用户名public string Password { get; set; } // 密码}
}
- 定义用户登录模型,包含用户名和密码。
5. 创建 JWT 工具类
在 Helpers
文件夹中创建 JwtHelper.cs
:
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;namespace JwtAuthDemo.Helpers
{public static class JwtHelper{/// <summary>/// 生成JWT Token/// </summary>/// <param name="userId">用户ID</param>/// <param name="configuration">配置对象</param>/// <returns>JWT Token字符串</returns>public static string GenerateJwtToken(string userId, IConfiguration configuration){var jwtSettings = configuration.GetSection("Jwt"); // 读取JWT配置var key = Encoding.ASCII.GetBytes(jwtSettings["Key"