在现代的Web应用程序中,安全性是至关重要的,特别是在API接口中。JWT(JSON Web Token)是一种简洁的方式来验证用户身份,并提供对资源的安全访问。本文将详细介绍如何在.NET 6.0 Web API中使用JWT生成和验证Token。
一、创建ASP.NET Core Web API项目
首先,我们需要创建一个ASP.NET Core Web API项目。在命令行中运行以下命令:
dotnet new webapi -n JwtWebApiDemo
cd JwtWebApiDemo
接着,我们安装所需的NuGet包,主要是 System.IdentityModel.Tokens.Jwt
和 Microsoft.AspNetCore.Authentication.JwtBearer
:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
二、配置JWT服务
在Program.cs
中添加JWT相关的服务和中间件配置。代码如下:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// 读取配置文件中的JWT密钥
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];
var issuer = jwtSettings["Issuer"];
var audience = jwtSettings["Audience"];
// 添加JWT身份验证服务
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = issuer,
ValidateAudience = true,
ValidAudience = audience,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
ValidateIssuerSigningKey = true,
};
});
builder.Services.AddAuthorization();
builder.Services.AddControllers();
var app = builder.Build();
// 使用身份验证和授权中间件
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
三、添加JWT配置到appsettings.json
在appsettings.json
中添加JWT相关的配置,以便于管理密钥和其他参数:
{
"JwtSettings": {
"SecretKey": "YourSuperSecretKeyHere12345!",
"Issuer": "yourIssuer",
"Audience": "yourAudience"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
四、创建身份认证控制器
接下来,我们创建一个控制器来处理用户登录并生成JWT Token。创建一个AuthController
,代码如下:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
[HttpPost("login")]
public IActionResult Login([FromBody] UserModel userModel)
{
// 进行身份验证(这里可以用数据库验证)
if (userModel.Username != "test" || userModel.Password != "password")
{
return Unauthorized();
}
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userModel.Username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSuperSecretKeyHere12345!"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "yourIssuer",
audience: "yourAudience",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return Ok(new
{
Token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
}
public class UserModel
{
public string Username { get; set; }
public string Password { get; set; }
}
五、保护API端点
为了测试JWT验证,我们可以创建一个受保护的API端点。例如:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
六、测试
使用Postman或其他HTTP客户端,首先以POST请求访问/api/auth/login
接口并提供正确的用户名和密码。成功后将收到一个JWT Token。然后在之后的请求中,将此Token放入Authorization头中,每次请求受保护的资源时进行身份验证。
总结
通过以上步骤,我们实现了在.NET 6.0 Web API中使用JWT进行身份验证和授权的功能。JWT的使用让我们能够方便、安全地管理用户会话,并保护API端点。希望这篇文章能够帮助您在项目中有效应用JWT。