在.NET Core中实现JWT认证的关键步骤如下:
1. 安装必要的NuGet包
Microsoft.AspNetCore.Authentication.JwtBearer:用于JWT认证中间件。System.IdentityModel.Tokens.Jwt:用于生成和验证JWT Token。
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt
2. 配置JWT参数
在 appsettings.json 中添加JWT配置项:
{
"Jwt": {
"Key": "YourSecretKeyAtLeast256BitsLong", // 安全密钥(推荐256位以上)
"Issuer": "https://yourdomain.com", // 颁发者
"Audience": "your_audience", // 受众
"ExpireMinutes": 60 // 有效期(分钟)
}
}
3. 注册JWT认证服务
在 Program.cs 中配置JWT认证:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// 注册JWT服务
builder.Services.AddAuthentication(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:Key"]))
};
});
// 添加授权服务
builder.Services.AddAuthorization();
4. 创建登录接口生成Token
创建登录接口,验证用户后生成JWT Token:
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel user)
{
// 1. 验证用户身份(示例代码,需替换实际验证逻辑)
if (user.Username != "admin" || user.Password != "123")
return Unauthorized();
// 2. 生成Token
var claims = new[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Role, "Admin") // 添加角色声明
};
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])),
signingCredentials: credentials);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
5. 启用认证和授权中间件
在 Program.cs 中确保中间件顺序正确:
var app = builder.Build();
// 启用认证和授权中间件(顺序不能错!)
app.UseAuthentication();
app.UseAuthorization();
// 其他中间件配置...
app.MapControllers();
app.Run();
6. 使用[Authorize]保护API
在需要认证的Controller或Action上添加 [Authorize]:
[ApiController]
[Route("api/[controller]")]
[Authorize] // 整个Controller需要认证
public class SecureController : ControllerBase
{
[HttpGet]
public IActionResult GetSecureData()
{
return Ok("This is protected data.");
}
[HttpGet("admin")]
[Authorize(Roles = "Admin")] // 仅允许角色为Admin的用户访问
public IActionResult AdminOnly()
{
return Ok("Admin access granted.");
}
}
关键注意事项
- 密钥安全:生产环境应使用安全方式存储密钥(如环境变量、Azure Key Vault)。
- HTTPS:始终通过HTTPS传输Token。
- Token有效期:根据安全需求设置合理的过期时间。
- Claims设计:避免在Token中存储敏感信息。
通过以上步骤,即可在.NET Core中实现基于JWT的身份认证与授权。

844

被折叠的 条评论
为什么被折叠?



