.NET Core 8中是否可仅用JWT替代Cookie认证及实现方法?
完全可以。JWT是一种无状态的身份认证方案,无需依赖Cookie存储会话信息,非常适合前后端分离、纯API服务等场景,完全能替代Cookie身份认证。
以下是具体实现步骤:
1. 配置JWT认证服务
在Program.cs中注册并配置JWT认证中间件:
var builder = WebApplication.CreateBuilder(args); // 添加JWT认证服务 builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])) }; }); builder.Services.AddAuthorization(); var app = builder.Build(); // 启用认证和授权中间件(注意顺序:先认证后授权) app.UseAuthentication(); app.UseAuthorization(); app.Run();
同时在appsettings.json中添加JWT配置项:
{ "Jwt": { "Issuer": "YourAppIssuer", "Audience": "YourAppAudience", "SecretKey": "YourStrongSecretKeyAtLeast16CharsLong", "ExpiresInMinutes": 60 } }
2. 生成JWT令牌
创建登录接口,用于验证用户身份并返回JWT令牌:
[ApiController] [Route("api/account")] public class AccountController : ControllerBase { private readonly IConfiguration _config; public AccountController(IConfiguration config) { _config = config; } [HttpPost("login")] public IActionResult Login([FromBody] LoginRequest request) { // 替换为实际的用户验证逻辑(比如从数据库查询用户) if (request.Username == "demo" && request.Password == "demo123") { // 构造用户声明信息 var claims = new[] { new Claim(ClaimTypes.Name, request.Username), new Claim(ClaimTypes.Role, "User") }; // 生成签名密钥 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:SecretKey"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); // 创建JWT令牌 var token = new JwtSecurityToken( issuer: _config["Jwt:Issuer"], audience: _config["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpiresInMinutes"])), signingCredentials: creds); return Ok(new { AccessToken = new JwtSecurityTokenHandler().WriteToken(token) }); } return Unauthorized("用户名或密码错误"); } } public class LoginRequest { public string Username { get; set; } public string Password { get; set; } }
3. 保护API端点
在需要限制访问的控制器或接口上添加[Authorize]特性:
[ApiController] [Route("api/protected")] [Authorize] public class ProtectedController : ControllerBase { [HttpGet] public IActionResult GetUserInfo() { var username = User.Identity.Name; return Ok($"当前登录用户:{username}"); } }
4. 客户端携带令牌请求
客户端获取到JWT令牌后,需要在请求头中携带令牌才能访问受保护的接口,示例(JavaScript):
const token = "获取到的JWT令牌"; fetch("/api/protected", { method: "GET", headers: { "Authorization": `Bearer ${token}` } }) .then(response => response.json()) .then(data => console.log(data)) .catch(err => console.error(err));
注意事项
- 生产环境中,JWT密钥不要硬编码,建议通过环境变量存储
- 可根据业务需求添加刷新令牌机制,解决令牌过期问题
- 务必使用HTTPS传输令牌,防止被窃取或篡改
内容的提问来源于stack exchange,提问作者Jelena Nikolic
相关产品推荐
相关产品推荐

