You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 8中是否可仅用JWT替代Cookie认证及实现方法?

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:53:22