Section 4 of 6

JWT Bearer Authentication

🎯 What You'll Learn

  • What is JWT
  • Setting up JWT authentication
  • Generating JWT tokens
  • Validating JWT tokens
  • Using JWT in APIs

What is JWT?

JWT (JSON Web Token) is a compact, self-contained token for securely transmitting information between parties. It's commonly used for API authentication.

JWT Structure: header.payload.signature

Setting Up JWT Authentication

1. Install Package

Install NuGet Package Bash
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

2. Configure JWT

appsettings.json JSON
{
  "Jwt": {
    "Key": "your-secret-key-min-32-characters",
    "Issuer": "InvenTrack",
    "Audience": "InvenTrackUsers"
  }
}

3. Add JWT Authentication

Program.cs C#
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"]!))
        };
    });

Generating JWT Tokens

Login Endpoint C#
[HttpPost("login")]
public async Task<IActionResult> Login(LoginRequest request)
{
    // Validate credentials
    var user = await ValidateUser(request.Email, request.Password);
    if (user == null)
        return Unauthorized();

    // Create claims
    var claims = new[]
    {
        new Claim(ClaimTypes.Name, user.Email),
        new Claim(ClaimTypes.Email, user.Email),
        new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };

    // Create token
    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.UtcNow.AddHours(24),
        signingCredentials: creds
    );

    return Ok(new
    {
        token = new JwtSecurityTokenHandler().WriteToken(token),
        expiration = token.ValidTo
    });
}

Using JWT in API Calls

HTTP Request Header HTTP
GET /api/products
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Protect API Endpoint C#
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts()
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        return Ok(products);
    }
}

Key Takeaways

  • JWT: Self-contained token for APIs
  • Structure: header.payload.signature
  • AddJwtBearer(): Configure JWT authentication
  • JwtSecurityToken: Generate tokens
  • Authorization header: Bearer {token}
  • Best for: APIs, SPAs, mobile apps