.NET Core Mikroservis Projelerinde Ocelot ile Yetkilendirme
.NET Core mikroservis mimarisinde Ocelot kullanarak yetkilendirme işlemlerinin nasıl yapıldığına dair temel bilgiler ve örnek kodlar.
Mikroservis mimarisi, uygulamaları bağımsız, küçük, dağıtılabilir ve ölçeklenebilir hizmetlere bölmeyi amaçlar. Bu yaklaşımın getirdiği karmaşıklıklardan biri de yetkilendirme ve kimlik doğrulama (Authentication & Authorization) işlemlerinin yönetimidir. Ocelot, .NET Core tabanlı mikroservis projelerinde API Gateway olarak kullanılarak bu karmaşıklığı basitleştirir ve merkezi bir yetkilendirme noktası sunar.
Ocelot Nedir?
Ocelot, .NET Core tabanlı, açık kaynaklı bir API Gateway'dir. Temel olarak gelen istekleri alır, rotalarını belirler, yetkilendirme işlemlerini gerçekleştirir ve ilgili mikroservise yönlendirir. Bu sayede mikroservislerin kendileri kimlik doğrulama ve yetkilendirme mantığıyla uğraşmak zorunda kalmazlar.
Neden Ocelot Kullanmalıyız?
- Merkezi Yetkilendirme: Yetkilendirme işlemlerini tek bir noktada yöneterek mikroservislerin karmaşıklığını azaltır.
- Rota Yönetimi: Gelen istekleri doğru mikroservise yönlendirerek yük dengeleme ve yönlendirme işlemlerini kolaylaştırır.
- Güvenlik: API'lerinizi yetkisiz erişime karşı korur.
- Ölçeklenebilirlik: Yüksek trafikli ortamlarda performansı artırır.
Temel Kavramlar
- Authentication (Kimlik Doğrulama): Kullanıcının kimliğini doğrulama işlemidir. Genellikle kullanıcı adı ve şifre veya token tabanlı yöntemlerle yapılır.
- Authorization (Yetkilendirme): Kullanıcının belirli bir kaynağa erişim yetkisinin olup olmadığını kontrol etme işlemidir.
- API Gateway: Mikroservisler önünde duran, gelen istekleri yöneten ve yönlendiren bir ara katmandır.
Ocelot ile Yetkilendirme Adımları
- Ocelot Projesi Oluşturma: Yeni bir .NET Core Web API projesi oluşturun ve gerekli Ocelot paketlerini yükleyin.
- Ocelot Konfigürasyonu:
ocelot.json
dosyası ile rotaları ve yetkilendirme kurallarını tanımlayın. - Yetkilendirme Middleware'i: Ocelot middleware'ini kullanarak yetkilendirme işlemlerini gerçekleştirin.
- Mikroservis Entegrasyonu: Mikroservislerinizi Ocelot üzerinden erişilebilir hale getirin.
Gerekli Paketler
Aşağıdaki NuGet paketlerini projenize eklemeniz gerekmektedir:
- Ocelot: API Gateway işlevselliğini sağlar. https://www.nuget.org/packages/Ocelot
- Microsoft.AspNetCore.Authentication.JwtBearer: JWT tabanlı kimlik doğrulama için gereklidir (eğer JWT kullanıyorsanız). https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearer
Örnek Kod Blokları
1. Ocelot Projesi Oluşturma ve Paketleri Yükleme:
dotnet new webapi -n OcelotGateway
cd OcelotGateway
dotnet add package Ocelot
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. Program.cs
Dosyası:
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
//Ocelot.json dosyasını konfigürasyon dosyasına ekleme
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
//JWT Bearer kimlik doğrulamasını yapılandırma
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"]!))
};
});
//Ocelot servislerini ekleme
builder.Services.AddOcelot(builder.Configuration);
var app = builder.Build();
app.UseAuthentication(); // Authentication'ı aktifleştir
app.UseAuthorization(); // Authorization'ı aktifleştir
//Ocelot middleware'ini ekleme
app.UseOcelot().Wait();
app.Run();
3. ocelot.json
Konfigürasyon Dosyası:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/products",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001 //Product Service portu
}
],
"UpstreamPathTemplate": "/products",
"UpstreamHttpMethod": [ "Get", "Post" ],
"AuthenticationOptions": {
"AuthenticationProviderKey": "Bearer",
"AllowedScopes": []
},
"RateLimitOptions": {
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 10
}
},
{
"DownstreamPathTemplate": "/api/users",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5002 //User Service portu
}
],
"UpstreamPathTemplate": "/users",
"UpstreamHttpMethod": [ "Get", "Post" ] ,
"AuthenticationOptions": {
"AuthenticationProviderKey": "Bearer",
"AllowedScopes": []
},
"RateLimitOptions": {
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 10
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:5000" //Ocelot Gateway'in adresi
}
}
Açıklama:
- Routes: Rotaların tanımlandığı bölümdür.
- DownstreamPathTemplate: Mikroservisin endpoint'i.
- DownstreamScheme: Protokol (http/https).
- DownstreamHostAndPorts: Mikroservisin çalıştığı adres ve port.
- UpstreamPathTemplate: API Gateway üzerinden erişilecek endpoint.
- UpstreamHttpMethod: İzin verilen HTTP metotları.
- AuthenticationOptions: Yetkilendirme ayarları.
AuthenticationProviderKey
ile hangi kimlik doğrulama şemasının kullanılacağı belirtilir. - RateLimitOptions: İstek sınırlama ayarları.
- GlobalConfiguration: Genel ayarlar.
- BaseUrl: Ocelot Gateway'in çalıştığı adres.
4. Mikroservislerde Kimlik Doğrulama (Örnek):
Mikroservislerinizde de JWT kimlik doğrulamasını yapılandırmanız gerekir. Bu kısım mikroservislerin kendi sorumluluğundadır ve Ocelot bu kimlik doğrulama işlemini tetiklemez, sadece gelen token'ı doğrular. Örnek bir Product servis yapılandırması:
//Product Service Program.cs
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
//JWT Bearer kimlik doğrulamasını yapılandırma
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"]!))
};
});
builder.Services.AddControllers(); // Controller'ları ekleme
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers(); // Controller'ları route'lara eşleme
app.Run();
5. JWT Token Üretimi (Örnek):
Kimlik doğrulama servisinizde JWT token üretimi yapmanız gerekecektir. Bu örnek, bir JWT token oluşturma işlemini gösterir:
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
public string GenerateJwtToken(string userId)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]!));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[] {
new Claim(ClaimTypes.NameIdentifier, userId),
new Claim(ClaimTypes.Role, "User") //Örnek rol
};
var token = new JwtSecurityToken(_configuration["Jwt:Issuer"],
_configuration["Jwt:Audience"],
claims,
expires: DateTime.Now.AddMinutes(120), //Token geçerlilik süresi
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
6. Yetkilendirme (Roles & Policies):
Daha detaylı yetkilendirme senaryoları için (örneğin, belirli rollere sahip kullanıcıların belirli endpoint'lere erişebilmesi), [Authorize]
attribute'unu ve policy'leri kullanabilirsiniz.
[Authorize(Roles = "Admin")] //Sadece Admin rolüne sahip kullanıcılar erişebilir.
[HttpGet]
public IActionResult GetAdminData()
{
return Ok("Admin data");
}
Veya policy bazlı yetkilendirme:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole", policy =>
policy.RequireRole("Admin"));
});
//...
[Authorize(Policy = "RequireAdminRole")]
[HttpGet]
public IActionResult GetAdminData()
{
return Ok("Admin data");
}
Sonuç:
Ocelot, .NET Core mikroservis projelerinde yetkilendirme ve kimlik doğrulama işlemlerini merkezi bir şekilde yönetmek için güçlü bir araçtır. Yukarıdaki adımları izleyerek ve örnek kodları adapte ederek mikroservislerinizi güvenli bir şekilde Ocelot üzerinden erişilebilir hale getirebilirsiniz. Unutmayın, JWT token üretimi ve yönetimi kimlik doğrulama servisinizin sorumluluğundadır. Ocelot ise sadece gelen token'ın geçerliliğini doğrular ve rotalama işlemini gerçekleştirir. Bu örnekler temel bir rehber niteliğindedir. Gerçek dünya senaryolarında, güvenlik ve ölçeklenebilirlik gereksinimlerinize göre daha karmaşık konfigürasyonlar gerekebilir.