在 .NET 8.0 中实现 JWT(JSON Web Token)登录和鉴权,可以帮助我们在构建 Web API 时确保安全性。在这篇文章中,我们将通过一个示例说明如何在 .NET 8.0 Web API 项目中使用 JWT 进行用户身份验证。

1. 创建项目

首先,我们需要创建一个新的 .NET 8.0 Web API 项目。在命令行中运行以下命令:

dotnet new webapi -n JwtAuthExample
cd JwtAuthExample

2. 安装 NuGet 包

我们需要添加一些依赖包来支持 JWT 认证。打开终端并运行:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.Text.Json

3. 配置 JWT 选项

appsettings.json 中添加 JWT 配置:

{
  "Jwt": {
    "Key": "YourSuperSecretKey12345",
    "Issuer": "YourIssuer",
    "Audience": "YourAudience",
    "ExpireMinutes": 60
  },
  // 其他配置...
}

4. 创建用户模型

我们需要一个用户模型来表示用户信息,这里我们创建一个简单的 User 类:

public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
}

5. 创建 JWT 服务

接下来,我们需要一个服务来生成 JWT。创建一个 JwtTokenService 类:

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

public class JwtTokenService
{
    private readonly IConfiguration _configuration;

    public JwtTokenService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string GenerateToken(string username)
    {
        var claims = new[]
        {
            new Claim(ClaimTypes.Name, username)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var creds = 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: creds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

6. 配置身份验证

Program.cs 文件中配置身份验证服务:

var builder = WebApplication.CreateBuilder(args);

// 添加JWT认证
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = 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.AddSingleton<JwtTokenService>();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

7. 创建登录控制器

然后我们需要一个控制器来处理用户登录请求:

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{
    private readonly JwtTokenService _jwtTokenService;

    public AuthController(JwtTokenService jwtTokenService)
    {
        _jwtTokenService = jwtTokenService;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] User user)
    {
        // 在这里验证用户(通常是查询数据库)
        if (user.Username == "test" && user.Password == "password") // 示例用户
        {
            var token = _jwtTokenService.GenerateToken(user.Username);
            return Ok(new { Token = token });
        }

        return Unauthorized();
    }
}

8. 保护其他控制器

我们可以创建一个受保护的控制器,只有在提供有效的 JWT 时才能访问:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
[Authorize]
public class ProtectedController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProtectedData()
    {
        return Ok("This is protected data.");
    }
}

9. 测试

您可以使用 Postman 或其他工具测试 API:

  1. 进行登录请求 (POST /auth/login),如:

{ "username": "test", "password": "password" }

成功后将返回一个 JWT。

  1. 使用上述 JWT 访问受保护的资源 (GET /protected),并在请求头中添加 Authorization 头:

Authorization: Bearer [your_token]

结论

通过上述步骤,我们已经在 .NET 8.0 Web API 项目中实现了 JWT 登录和鉴权。JWT 让我们的 API 更加安全,同时确保了用户的身份验证过程简单高效。这种方式适合于 RESTful 风格的接口,是当前主流的身份验证方式之一。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部