Web uygulamalarında sayfalar arasında veri paylaşımı, karar süreçleri oluşturmak vb. sebeplerden ötürü parametrelere ihtiyaç duyabiliriz. Örneğin: https://localhost:5000/gonder?islemId=1&kullaniciId=2 bağlantısı ile IslemId ve kullaniciId QueryString parametrelerinin ilgili işlemi yapacak sunucu taraflı operasyona gönderildiği açıkca görülmektedir. Uygulama güvenliği açısından hassas bilgilerin ve programsal parametrelerin dışa kapalı veya kullanıcıya bir anlam ifade etmeyecek şekilde tasarlanması ön plana çıkmaktadır.

ASP.NET Core ile basitçe uygulama içerisinde HTTP üzerinden taşıdığımız verilerin güvenliği ve şifrelenmesi konusunda şu adımları izleyebiliriz.

Microsoft.AspNetCore.DataProtection paketi ile gelen özellikler sayesinde ASP.NET Core uygulamasına basitçe veri güvenliği kabiliyetleri kazandırabiliriz. Bunun için bir web uygulaması projesinin Startup.cs dosyası ConfigureServices metodu şu şekilde olmalıdır:

Böylelikle çalışma zamanında IDataProtectionProvider arayüzünden oluşturacağımız IDataProtector tipinde bir örnek aracılığıyla string tipindeki bilgileri şifreleyebileceğiz.

Oluşturduğum DefaultDataProtectorProvider isimli sınıf ile istediğimiz verileri uygulama boyunca şifreli veya çözümlü hale getireceğiz. Bu tipi .NET Core un kalbine işleyelim:

Böylelikle DefaultDataProtectorProvider tipine ihtiyacımız olduğunda bu sınıfı DI Container tarafından çözümlenen her hangi bir tipin constructor metoduna geçmemiz yeterli olacaktır:

private readonly DefaultDataProtectorProvider _dataProtector;
public HomeController(DefaultDataProtectorProvider dataProtector)
{
	_dataProtector = dataProtector;
    var protectedPayload = _dataProtector.Protect("Hello World!");
	var unprotectedPayload = _dataProtector.Unprotect(protectedPayload);
}

Yukarıda basit bir sözcenin şifrelenip, çözümlenmesi gösterilmektedir. Örneğimizi biraz daha geliştirip uygulama boyunca tüm QueryString parametrelerinin güvenliğini sağlamaya çalışalım.

Bunun için Middleware kavramından destek alalım. Middleware; Bir HTTP isteğinin sunucumuz sorumluluğuna girdiği (pipeline) andan itibaren, çeşitli adımlardan geçerek şekillendirildiği ve sonunda verilecek cevabın hazır olmasına kadar geçen sürede kullanabileceğimiz bir yapı olarak tanımlayabiliriz. Örnek ile daha iyi anlaşılacaktır.

QueryStringMiddleware ismi ile .NET Core' un beklediği özelliklerde (public Task geri dönüş tipinde Invoke isminde bir metot içermesi gerekmektedir.) middleware tanımlıyorum:

Bu middleware in .NET Core HttpRequest işleyici süreçlerinde kullanılması için startup.cs -> Configure metodunu şu şekilde güncelliyorum:

Bu sayede sunucumuza gelen her türlü HTTP isteğinin QueryStringMiddleware -> Invoke metodu içerisinde işlem görmesini sağlıyorum. Invoke metoduna geçtiğiniz parametrelerin DI Container tarafında kayıt edilmesine dikkat ediniz. (ConfigureServices metodu)

Genişletilmiş bir metot aracılığıyla vereceğimiz parametreler ile güvenli bir bağlantı - link oluşturmayı sağlayalım:

Bu genişletilmiş metodu View ve Controller tiplerinde kolaylıkla şu şekilde kullanabiliriz:

Böylelikle oluşan güvenli link ile gelen istek öncelikle QueryStringMiddleware tarafından HTTP Get metodu ve QueryString öbeğinin qs anahtarına sahip olup olmadığı kontrolü yapılır. Daha sonra şifrelenmiş veri uygun parametrelere çevrilek - çözümlenerek isteğin yeni QueryString öbeği ile diğer süreçlere aktarımı sağlanır.

Proje kaynak kodlarına Github dan erişebilirsiniz.
Faydalı olması dileğiyle...