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

在ASP.NET Core Web API中实现JWT Token登录接口的需求

实现ASP.NET Core Web API的JWT登录接口

步骤1:确认依赖包

确保项目已安装Microsoft.AspNetCore.Authentication.JwtBearer包,可通过NuGet安装,或在项目的.csproj文件中添加以下引用(版本号根据你的.NET Core版本调整):

<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />

步骤2:完善配置文件

补全appsettings.json中的Issuer,并新增Audience参数(JWT标准通常要求该参数):

"AppSettings": {
  "Issuer": "https://your-api-domain.com",
  "Audience": "https://your-api-domain.com",
  "Key" : "ThisIsMySecretKeyWith32BitLetters"
}

步骤3:在Program.cs配置JWT认证服务

在Program.cs中添加JWT认证的服务配置:

var builder = WebApplication.CreateBuilder(args);

// 读取AppSettings配置节点
var appSettings = builder.Configuration.GetSection("AppSettings");

// 注册JWT认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = appSettings["Issuer"],
            ValidAudience = appSettings["Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings["Key"]))
        };
    });

// 注册控制器服务
builder.Services.AddControllers();

var app = builder.Build();

// 启用认证、授权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

步骤4:编写Token生成方法

在控制器中新增生成JWT Token的私有方法,同时需要向控制器注入IConfiguration以读取配置:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

// 控制器构造函数注入依赖
private readonly YourDbContext _mydb;
private readonly IConfiguration _configuration;

public YourController(YourDbContext mydb, IConfiguration configuration)
{
    _mydb = mydb;
    _configuration = configuration;
}

// 生成JWT Token的私有方法
private string GenerateJwtToken(Login userFromDb)
{
    var appSettings = _configuration.GetSection("AppSettings");
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings["Key"]));
    var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

    // 添加自定义Claims(可根据业务需求扩展,比如用户ID、角色等)
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, userFromDb.Email),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
        new Claim("UserId", userFromDb.Id.ToString()) // 假设Login实体包含Id字段
    };

    // 创建Token实例
    var token = new JwtSecurityToken(
        issuer: appSettings["Issuer"],
        audience: appSettings["Audience"],
        claims: claims,
        expires: DateTime.Now.AddHours(2), // 设置Token有效期为2小时
        signingCredentials: signingCredentials
    );

    // 序列化Token为字符串返回
    return new JwtSecurityTokenHandler().WriteToken(token);
}

步骤5:修改登录接口返回Token

更新原登录接口,在验证通过后生成并返回Token:

[HttpPost("login")]
public IActionResult Login(Login user)
{
    // 注意:生产环境禁止明文存储/比对密码,必须使用哈希算法(如BCrypt)处理密码
    var person = _mydb.Login
                      .FirstOrDefault(c => c.Email == user.Email 
                                           && c.password == user.password);

    if (person != null)
    {
        var token = GenerateJwtToken(person);
        return Ok(new { Token = token, Message = "Login successful" });
    }
    else
    {
        return BadRequest("Authentication failed");
    }
}

重要注意事项

  • 密码安全:生产环境必须使用哈希算法(如BCrypt、Argon2)存储用户密码,验证时比对哈希值,禁止明文操作。
  • 密钥安全:不要将密钥硬编码在代码中,生产环境建议使用环境变量、Azure Key Vault等安全存储方案。
  • Token有效期:可根据业务需求调整Token过期时间,复杂场景建议实现刷新Token机制,避免用户频繁登录。

内容的提问来源于stack exchange,提问作者Vengat Ramanan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:37:24