在现代的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.JwtMicrosoft.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。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部