ASP.NET Core uygulamalarında yapılandırma kaynaklarını, secret rotasyonunu, Options doğrulamasını ve canlı ayar değişimlerini üretim koşullarında yönetmeyi öğrenin. Bu asp.net core eğitimi odağı, hatalı deploy riskini azaltır.
ASP.NET Core Eğitimi: Üretimde Güvenli Konfigürasyon Tasarımı
ASP.NET Core Eğitimi: Konfigürasyon Kaynaklarının Kesin Sırası
Bir ASP.NET Core sürecinde aynı anahtar birden fazla sağlayıcıda varsa son eklenen sağlayıcı kazanır. Bu nedenle .NET Core eğitimi kapsamında sadece appsettings.json dosyasını okumak yeterli değildir: container ortamında ConnectionStrings__Main ortam değişkeni, JSON içindeki ConnectionStrings:Main değerini ezer. Çalışan sürecin gerçekten hangi değeri kullandığını geliştirme ortamında IConfigurationRoot.GetDebugView() ile inceleyin; bu çıktı secret değerlerini içerebileceğinden loglara yazılmamalıdır.
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
var root = (IConfigurationRoot)builder.Configuration;
Console.WriteLine(root.GetDebugView()); // Sadece yerelde inceleyin
}
var app = builder.Build();
app.Run();Varsayılan host kurulumu JSON, kullanıcı sırları, ortam değişkenleri ve komut satırı sağlayıcılarını zaten ekler; buna rağmen özel bir sağlayıcı eklediğinizde sıralamayı bilinçli belirleyin. Örneğin merkezi bir secret sağlayıcısını builder.Configuration.AddAzureKeyVault(...) ile ortam değişkenlerinden sonra eklerseniz, acil durum için verilen bir pod environment variable override'ı etkisiz kalabilir. Operasyonel tercih açık olmalıdır: secret kasası otoriteyse en sona eklenir; deployment manifesti otoriteyse kasadan önce eklenir. Key adı normalizasyonu kritik bir ayrıntıdır: Linux ortam değişkeninde __, .NET tarafında : olarak yorumlanır; tek alt çizgi hiyerarşi oluşturmaz.
C# Eğitimi: Options Binding, Fail-Fast Doğrulama ve Başlatma Hataları
Ham IConfiguration["Payments:BaseUrl"] okumaları typo ve eksik değerleri ancak istek geldiğinde görünür yapar. Bunun yerine bağlama, DataAnnotations ve iş kuralı doğrulamasını başlatma aşamasına taşıyın. ValidateOnStart(), uygulamanın trafik almadan başarısız olmasını sağlar; Kubernetes'te bu pod'un Ready durumuna geçmemesi anlamına gelir. Bu c# eğitimi örneğinde URL'nin mutlak olması ve timeout aralığı, doğrudan uygulama sınırında denetlenir.
using System.ComponentModel.DataAnnotations;
public sealed class PaymentsOptions
{
public const string SectionName = "Payments";
[Required, Url]
public string BaseUrl { get; init; } = null!;
[Range(1, 60)]
public int TimeoutSeconds { get; init; }
}
builder.Services.AddOptions<PaymentsOptions>()
.BindConfiguration(PaymentsOptions.SectionName)
.ValidateDataAnnotations()
.Validate(o => Uri.TryCreate(o.BaseUrl, UriKind.Absolute, out _),
"Payments:BaseUrl must be an absolute URI")
.ValidateOnStart();required veya = null! derleyicinin nesne kurulumu hakkındaki bilgisini iyileştirir, fakat ConfigurationBinder kaynakta olmayan anahtar için üretimde güvenilir bir koruma değildir. Özellikle dizi bağlamada eski indekslerin kalabildiği senaryoları test edin: bir ortamda AllowedOrigins__0 ve AllowedOrigins__1, diğerinde yalnızca AllowedOrigins__0 tanımlanması beklenmedik CORS davranışı doğurabilir. En azından CI içinde gerçek konfigürasyon şablonunu yükleyip doğrulamayı çalıştırın: dotnet test --filter FullyQualifiedName~Configuration. Bu yaklaşım, bir csharp kursu laboratuvarında da unit test ile deployment manifesti arasındaki bağı görünür kılar.
.NET Core Eğitimi: Secret Kaynakları ve Rotasyon Protokolü
Geliştirici makinesinde bağlantı parolası için appsettings.Development.json kullanmayın; dosya git geçmişinden silinse bile fork veya artifact içinde kalmış olabilir. Proje kimliğiyle ilişkilendirilmiş User Secrets deposunu kullanın ve sadece örnek bir anahtar şeması commit edin.
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:Main" "Host=localhost;Database=orders;Username=app;Password=local-only"
dotnet user-secrets listÜretimde secret'ı image katmanına ENV veya kopyalanmış JSON olarak koymak, registry erişimi olan herkesin değeri okuyabilmesi riskini doğurur. Kubernetes kullanılıyorsa secret'ı dosya olarak bağlayıp uygulamanın yalnızca bu dizinden okumasını sağlayın; ilgili ServiceAccount'a sadece gereken secret için get izni verin. Rotasyonda iki parolayı aynı anda geçerli tutun: önce veritabanında ikinci credential oluşturulur, sonra secret deposu güncellenir, yeni pod'lar doğrulanır, en son eski credential iptal edilir. Tek parolayı aniden değiştirmek, connection pool içindeki mevcut bağlantıların hata vermesine yol açar.
volumeMounts:
- name: app-secrets
mountPath: /mnt/secrets
readOnly: true
volumes:
- name: app-secrets
secret:
secretName: orders-db-credentialsMicrosoft teknolojileri eğitimi alan ekiplerin sık yaptığı hata, secret değerini maskelese bile connection string'i exception nesnesiyle birlikte telemetry'ye göndermektir. OpenTelemetry veya Application Insights için log alanlarını allow-list yaklaşımıyla kurun; ConnectionStrings, Authorization, Cookie ve token benzeri alanları serileştirmeyin. Örneğin health endpoint'inde yalnızca sağlayıcı adı ve bağlantı testinin süresi loglanmalı, bağlantı metni asla log scope'una eklenmemelidir.
Entity Framework Eğitimi: Connection String Değişince Ne Olur?
Canlı yapılandırma değişikliği her ayarda güvenli değildir. IOptionsMonitor<T>, değişen dosya veya sağlayıcı verisini sonraki okumada sunabilir; ancak EF Core DbContextOptions çoğu uygulamada DI kaydı kurulurken oluşturulur. Bu yüzden connection string rotasyonundan sonra yalnızca JSON dosyasını değiştirmek, mevcut pod'da yeni bağlantıya geçileceği anlamına gelmez. Entity Framework eğitimi içinde doğru operasyonel model, yeni secret sürümünden sonra kontrollü rollout yapmaktır: kubectl rollout restart deployment/orders-api ve readiness kontrolü tamamlanmadan eski pod'ları kaldırmamak.
İstek ömründe DbContext zaten scoped olmalıdır; singleton bir servis içine OrdersDbContext enjekte etmek hem scope ihlalidir hem de eski connection state'ini uzun süre tutabilir. Bağlantı havuzu davranışını görmek için PostgreSQL'de pg_stat_activity, SQL Server'da sys.dm_exec_sessions sorgulanabilir. Rotasyon testi sırasında aktif bağlantı sayısını deploy öncesi ve sonrası karşılaştırın; beklenen durum yeni pod'ların yeni kullanıcıyla bağlantı açması, eski pod kapanırken eski kullanıcı oturumlarının sıfıra inmesidir.
builder.Services.AddDbContext<OrdersDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("Main")));
// DbContext'i singleton'a değil, request scope'una enjekte edin.
app.MapGet("/orders/{id:guid}", async (Guid id, OrdersDbContext db) =>
await db.Orders.FindAsync(id) is { } order
? Results.Ok(order)
: Results.NotFound());Blazor Eğitimi ve API Ayarlarında Ölçülebilir Değişiklik Yönetimi
Konfigürasyon değişikliğinin etkisini varsaymak yerine ölçün. API tarafında dotnet-counters monitor --process-id <pid> System.Runtime Microsoft.AspNetCore.Hosting ile rollout öncesi ve sonrası gc-heap-size, exception sayısı ve istek hızını kaydedin; veritabanı için ayrı olarak connection login failure sayısını izleyin. Karşılaştırma aynı yük profili altında yapılmalıdır: örneğin k6 ile 10 dakika boyunca sabit 50 VU çalıştırıp hata oranını, p95 süreyi ve yeni credential ile açılan bağlantı sayısını birlikte değerlendirin.
import http from 'k6/http';
import { check } from 'k6';
export const options = { vus: 50, duration: '10m' };
export default function () {
const r = http.get(`${__ENV.BASE_URL}/health/ready`);
check(r, { 'ready is 200': x => x.status === 200 });
}Blazor Server'da IOptionsMonitor.OnChange callback'i birden fazla kez tetiklenebilir; dosya kaydetme işlemi birden fazla filesystem event üretebilir. Bu callback içinde doğrudan cache temizlemek veya kullanıcı oturumlarını dolaşmak yerine değişikliği debounce eden bir BackgroundService kuyruğuna yazın. Blazor eğitimi çalışmalarında ayrıca istemciye secret taşımama kuralını doğrulayın: wwwroot/appsettings.json ve WebAssembly'e publish edilen tüm dosyalar kullanıcı tarafından indirilebilir; burada yalnızca public API base URL gibi açık bilgiler bulunmalıdır.
İlgili Eğitim
YTÜSEM İlgili Eğitim
.NET Core ReactJS FullStack Eğitimi (Yıldız Teknik Üniversitesi SEM)
Sık Sorulan Sorular
.net core kursu projelerinde appsettings.json içindeki secret nasıl saklanmalı?
Yerelde `dotnet user-secrets set` kullanın; CI ve üretimde secret manager veya platform secret store kullanın. Secret'ı Docker image içine `COPY appsettings.json` ile koymayın. Repository için yalnızca `appsettings.example.json` ve boş/örnek değerler bırakın.
c# eğitimi sırasında IOptions ile IOptionsMonitor arasında nasıl seçim yapılır?
İstek boyunca sabit kalması gereken ayarlar için scoped tüketimde `IOptionsSnapshot
asp.net core eğitimi için konfigürasyon doğrulaması CI içinde nasıl test edilir?
Testte gerçek ayar şablonunu yükleyip `AddOptions
entity framework eğitimi kapsamında veritabanı parolası rotasyonundan sonra neden rollout gerekir?
EF Core DbContext yapılandırması uygulama başlangıcında oluşturulur ve ADO.NET connection pool eski kimlikle açılmış bağlantıları tutabilir. Secret değerini değiştirmek bu mevcut process içindeki DbContextOptions'u değiştirmez. Yeni secret sürümüyle pod rollout yapın, readiness endpoint'inin yeni bağlantıyla başarılı olduğunu görün, sonra eski credential'ı iptal edin.
AI / LLM Discovery
Bu makale Opendart Akademi Microsoft / C# eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.


