Yeni proje teklifleri kabul ediliyor +90 505 113 90 33 / muhammetelma24@gmail.com
Ana Sayfa/ Blog/ASP.NET Core
ASP.NET Core 28 Aralık 2024 10 dk okuma

JWT Authentication Adım Adım

Sıfırdan token tabanlı doğrulama, refresh token ve rol bazlı yetkilendirme örneğiyle.

[ Kapak görseli — JWT Authentication Adım Adım ]

Neden JWT?

Klasik cookie-based auth, monolitik bir uygulamada gayet işini görür. Ama:

  • Backend'i mobile app ile paylaşıyorsanız
  • Birden fazla servis var ve sessiona bağlı kalmak istemiyorsanız
  • SPA frontend kullanıyorsanız

JWT (JSON Web Token) doğru seçim oluyor. Token, sunucuda saklanmaz; client her istekte onu Authorization header'ında gönderir.

Kurulum

NuGet paketleri:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

Program.cs içinde:

builder.Services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(opts =>
    {
        opts.TokenValidationParameters = new()
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = config["Jwt:Issuer"],
            ValidAudience = config["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(config["Jwt:Key"]!))
        };
    });

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

Login Endpoint

[HttpPost("login")]
public async Task<IActionResult> Login(LoginDto dto)
{
    var user = await _userManager.FindByEmailAsync(dto.Email);
    if (user is null) return Unauthorized();

    var valid = await _userManager.CheckPasswordAsync(user, dto.Sifre);
    if (!valid) return Unauthorized();

    var token = GenerateJwt(user);
    return Ok(new { token });
}

private string GenerateJwt(AppUser user)
{
    var claims = new List<Claim>
    {
        new(ClaimTypes.NameIdentifier, user.Id),
        new(ClaimTypes.Email, user.Email!),
        new(ClaimTypes.Role, "Admin")
    };

    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtKey));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: _issuer,
        audience: _audience,
        claims: claims,
        expires: DateTime.UtcNow.AddMinutes(15),
        signingCredentials: creds);

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

Refresh Token

JWT ömrü kısa olmalı (15 dakika gibi). Ama kullanıcıyı her 15 dakikada yeniden giriş yapmaya zorlayamayız. Çözüm: refresh token.

  • Access token — 15 dakika, her istekte gönderilir
  • Refresh token — 7-30 gün, sadece "yeni access token al" isteğinde gönderilir, DB'de saklanır

Access süresi dolduğunda, client refresh ile yenisini ister; refresh de DB'de revoke edilebilir.

Güvenlik Notları

Üç altın kural
  1. Refresh token'ı HttpOnly + Secure cookie'de saklayın (localStorage yerine)
  2. Access token ömrü 15 dk'yı geçmesin
  3. JWT key en az 32 karakter ve rastgele üretilmiş olmalı; appsettings.json içine değil, ortam değişkenine veya Azure Key Vault'a koyun

JWT güvenli; ancak yanlış kullanılırsa kabusa dönüşebilir. Yukarıdaki kuralları takip edin, gerisi standart.

← Önceki Yazı

Razor Layout & Partial View'ları Doğru Kullanmak

Web Geliştirme · 10 Ocak 2025
Sonraki Yazı →

Multi-Tenant Mimari Nedir?

Sistem Tasarımı · 15 Aralık 2024
İlgili Yazılar

Bunlar da ilgini çekebilir.

Yazıyı beğendin mi?

Benzer içeriklerden haberdar olmak veya bir proje konuşmak için ulaş.