在 ASP.NET Web API 中实现 JWT(JSON Web Token)认证是一个非常标准且安全的选择。以下是实现该功能的步骤指南:
一. 安装必要的 NuGet 包
你需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。
html
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
二. 配置 Program.cs
1.在 Program.cs 中配置 JWT 认证服务,以便让系统能够解析和验证 Token。
使用时,需要设置密码,密码大于32位
cs
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
//改动1. 添加JWT令牌身份认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourdomain.com", // 实际使用时替换为云服务器主页
ValidAudience = "yourdomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的jwt密码,大于32位"))
};
});
使用jwt身份认证中间件
cs
var app = builder.Build();
app.UseAuthentication(); // 2. 启用jwt认证和授权中间件,,在MapControllers();前调用
app.UseAuthorization(); // 2. 启用jwt认证和授权中间件,在MapControllers();前调用
2.配置跨域
由于你的服务器会被外部浏览器访问,请务必处理以下两点:
cs
//配置跨域
builder.Services.AddCors(options => {
options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
app.UseCors("AllowAll");// 启用跨域,,,在 app.MapControllers() 之前添加
3.配置好后完整的主程序代码
使用时需要设置密码
cs
using Microsoft.AspNetCore.Authentication.JwtBearer;//引用空间
using Microsoft.IdentityModel.Tokens;//引用空间
using System.Text;//引用空间
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
//改动1. 添加JWT令牌身份认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourdomain.com", // 你的域名
ValidAudience = "yourdomain.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("cjp06630663@1234567899876543211990112906131376044019000000000000000000000000000000000000000000000000000000000"))
};
});
//改动2.跨域配置
builder.Services.AddCors(options => {
options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
builder.Services.AddControllers();
builder.Services.AddOpenApi();
var app = builder.Build();
app.UseAuthentication(); // 2. 启用jwt认证和授权中间件,,在MapControllers();前调用
app.UseAuthorization(); // 2. 启用jwt认证和授权中间件,在MapControllers();前调用
app.UseCors("AllowAll");//启用跨域,,在MapControllers();前调用
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}
三.创建用户对象类LoginRequest.cs
每一个用户都可以看成一个对象,包含用户名和密码,多个用户管理其实就是通过 list<类>来管理一个个用户对象
cs
namespace WebApplication1
{
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
}
四. 创建登录控制器 (生成 Token)
新建一个登录验证控制器类,这是个简单功能的验证,验证登录名和密码成功后并返回一个生成的 JWT令牌。用户拿着这个Token令牌就可以去访问加密的api

cs
using Microsoft.AspNetCore.Identity.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
/// <summary>
/// 登录验证,传入一个用户类对象,如果用户名和密码正确,则返回一个JWT令牌
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
// 验证用户逻辑...
if (request.Username == "admin" && request.Password == "123456")
{
var token = GenerateJwtToken(request.Username);// 给这个用户生成JWT令牌
return Ok(new { token });
}
return Unauthorized();// 如果用户名或密码不正确,返回未授权状态
}
//生成令牌
private string GenerateJwtToken(string username)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("主程序设置的密码,不少于32位"));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "yourdomain.com",
audience: "yourdomain.com",
claims: new[] { new Claim(ClaimTypes.Name, username) },
expires: DateTime.Now.AddHours(2),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
}
4. 需要JWT令牌才能访问的加密 API 接口
一是在需要验证的 Controller 或 Action 上添加 [Authorize] 特性。加上这标签后,服务器会自动将这个api设置为需要jwt令牌才能访问的api
cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class esp32 : ControllerBase
{
// GET: api/<esp32>
[Authorize]
[HttpGet("data")]
public IActionResult GetData()
{
return Ok("这是受保护的数据");
}
}
}
五.外部调用方法(http)
外部调用使用jwt加密的服务器api基本逻辑如下:
测试 JWT 验证功能,最快、最专业的方法是使用 Postman 或 Insomnia。这些工具可以让你无需编写任何代码,直接模拟 HTTP 请求。
以下是使用 Postman 进行快速测试的步骤:
1. 第一步:访问登录验证api 获取 Token
首先,你需要调用你的登录接口,获取服务器返回的 JWT 字符串。
http://localhost:5191/api/auth/login
http://localhost:5191/api/auth/login访问方式: POST
报文Body 用json格式上传服务器用户对象类的属性用户名和密码
如果用户名和密码正确,服务器就会给生成返回一个Token令牌给我们,有了这个Token,我们就可以去访问加密的服务器api了

2. 第二步:访问JWT加密服务器接口
在响应中找到 token 字段,将其复制下来。复制双引号内的内容

访问jwt令牌加密的服务器api
cs
[Route("api/[controller]")]
[ApiController]
public class esp32 : ControllerBase
{
// GET: api/<esp32>
[Authorize]
[HttpGet("data")]
public IActionResult GetData()
{
return Ok("这是受保护的数据");
}
}
这支api指定了data报文模式,所以我们需要用data路由才能get到
http://localhost:5191/api/esp32/data
http://localhost:5191/api/esp32/data
本文的头Headers需要写入Token令牌信息
- Headers :
- Key:
Authorization - Value:
Bearer <粘贴你的token>(注意:Bearer 后面有一个空格)
- Key:

这是用Postman这款软件能快速写入报文头这些信息,实际开发使用中要自己去封装报文,让网络请求报文Headers带有Token密匙
如果密匙和身份一致,成功拿到服务器加密API的数据
