Merhaba, web uygulamalarında kullanıcı doğrulama ve yetkilendirme işlemleri kritik önemdedir. Günümüzde, JSON Web Token (JWT), güvenilir ve kolay bir kullanıcı kimlik doğrulama yöntemi olarak yaygınlaşmıştır. Bu yazıda, ASP.NET Core ile JWT kullanarak basit bir login ve sipariş API’si geliştireceğiz.
Proje Yapısı
/Controllers
├── LoginController.cs
└── SiparisController.cs
/Models
├── LoginModel.cs
└── UserModel.cs
├── Program.cs
└── appsettings.json
NuGet Paketleri: Microsoft.AspNetCore.Authentication.JwtBearer
1. JWT Ayarları (appsettings.json)
İlk olarak, appsettings.json dosyasındaki JWT ayarlarını yapılandırmamız gerekir. Bu ayarlar, token üretiminde kullanılacak anahtar, yayıncı, hedef kitle gibi bilgileri içerir.
{
"Jwt": {
"Key": "Gercek-Uretimde-UserSecret-EnAz32KarakterliKeyKullanin!!!",
"Issuer": "MyApp",
"Audience": "MyAppUsers",
"ExpireMinutes": 60
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}
GÜVENLİK UYARISI:
Eğer proje dosyalarınızı Git gibi bir sürüm kontrol sistemine yüklüyorsanız,
Key değerini appsettings.json içinde bırakmayın!
Bu durumda User Secrets veya Environment Variables kullanmanız gerekir.
Ancak projeyi yalnızca kendi bilgisayarınızda geliştiriyor ve Git’e göndermiyorsanız,
geliştirme aşamasında burada durması bir sorun oluşturmaz.
2. Modeller
LoginModel.cs
namespace JwtMvcExample.Models
{
public class LoginModel
{
public string KullaniciAdi { get; set; } = string.Empty;
public string Sifre { get; set; } = string.Empty;
}
}
UserModel.cs
namespace JwtMvcExample.Models
{
public class UserModel
{
public string KullaniciAdi { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
}
}
3. LoginController (JWT Token Üretimi)
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using JwtMvcExample.Models;
namespace JwtMvcExample.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly IConfiguration _config;
public LoginController(IConfiguration config)
{
_config = config;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
// Örnek kullanıcı kontrolü (veritabanı yerine sabit)
if (model.KullaniciAdi == "admin" && model.Sifre == "1234")
{
var token = GenerateJwtToken(model.KullaniciAdi);
return Ok(new { token });
}
return Unauthorized("Geçersiz kullanıcı adı veya şifre.");
}
private string GenerateJwtToken(string kullaniciAdi)
{
var key = Encoding.UTF8.GetBytes(_config["Jwt:Key"]!);
var claims = new[] { new Claim(ClaimTypes.Name, kullaniciAdi) };
var creds = new SigningCredentials(new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpireMinutes"])),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
}
4. SiparisController (Yetkilendirilmiş Erişim)
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace JwtMvcExample.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize] // JWT zorunlu
public class SiparisController : ControllerBase
{
[HttpGet]
public IActionResult GetSiparisler()
{
var siparisler = new List<object>
{
new { Id = 1, Urun = "Laptop", Adet = 2, Fiyat = 25000 },
new { Id = 2, Urun = "Telefon", Adet = 1, Fiyat = 18000 }
};
return Ok(siparisler);
}
}
}
5. Program.cs (JWT Konfigürasyonu)
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using JwtMvcExample.Models;
var builder = WebApplication.CreateBuilder(args);
// JWT ayarları
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]!);
builder.Services.AddControllers();
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 = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});
builder.Services.AddAuthorization();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthentication(); // JWT kontrolü ÖNCE
app.UseAuthorization();
app.MapControllers();
app.Run();
Test Süreci (Postman/Swagger)
Login İsteği
| Method | URL | Body |
|---|---|---|
| POST |
{
"KullaniciAdi": "admin",
"Sifre": "1234"
}
|
Yetkili İstek
| Method | URL | Header |
|---|---|---|
| GET | Authorization: Bearer {token} |
Selamlar!
