ASP .NET Çerez yönetimi nasıl yapılır. Çerez güvenliği nasıl sağlanır?
Öncelikli olarak CookieOptions parametreleri ne işe yarıyor ve Microsoft.AspNetCore.DataProtection nedir ve neden kullanmalıyız konularında araştırma yapmanızı tavsiye ederim.
Aşağıda gerçekleştirmiş olacağımız yapılandırmaları iyice kontrol edip yayınlayınız. Veriler şifreleneceğinden bir sonraki değişikliklerinizde şifreli veriler etkileneceğinden geçici problemlerle karşılaşabilirsiniz.
Kodlamaya başlayalım. Startup.cs'de ConfigureServices'de servislerimize DataProtection'ı kullanacağımızı ekliyoruz. Burada sistemimize DataProtection Key'i oluşturup sistemimize tanıtıyoruz.
services.AddDataProtection()
.SetDefaultKeyLifetime(TimeSpan.FromDays(365 * 2))
.PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + "/AppData"))
.SetApplicationName("UygulamaAdi");
Şifreleme kütüphanemiz ve yapılandırmaları hazır. Şimdi çerezleri yöneteceğimiz sınıfımızı oluşturalım. (SameSiteMode.Unspecified özelliğini bulamazsanız SDK'yinizi güncelleyiniz ya da alternatif SameSiteMode.Lax kullanabilirsiniz.)
public static class CookieManager
{
private static CookieOptions GetCookieOptions()
{
return new()
{
HttpOnly = true,
Expires = DateTime.Now.AddDays(60),
Secure = true,
SameSite = SameSiteMode.Unspecified,
IsEssential = true
};
}
public static bool HasCookie(HttpContext context, string key)
{
return context.Request.Cookies.ContainsKey(key);
}
public static void SetCookieObjectAsJson(HttpContext context, string key, object value)
{
if (context.Request.Cookies[key] != "null" && context.Request.Cookies[key] != null)
context.Response.Cookies.Delete(key);
var protector = context.RequestServices.GetDataProtector("KorumaAnahtariEkleyin");
var data = protector.Protect(JsonConvert.SerializeObject(value));
context.Response.Cookies.Append(key, data, GetCookieOptions());
}
public static T GetCookieObjectFromJson<T>(HttpContext context, string key)
{
var value = context.Request.Cookies[key];
if (value == null)
return default;
var protector = context.RequestServices.GetDataProtector("KorumaAnahtariEkleyin");
var data = protector.Unprotect(value);
try
{
return JsonConvert.DeserializeObject<T>(data);
}
catch (Exception ex)
{
context.Response.Cookies.Delete(key);
Console.WriteLine(ex);
return default;
}
}
public static void DeleteCookie(HttpContext context, string key)
{
context.Response.Cookies.Delete(key);
}
}
Bu sınıfı kullanarak artık istediğiniz gibi çerezlerinizi güvenli bir şekilde yönetebilirsiniz. Çerez ekleme ve getirme için iki tane örnek kod koyup sizlere veda edeceğim. Bu sınıfa kullanmak istediğinizde HttpContext'i vermeniz yeterli olacaktır.
var model = new User();
model.Id = 1;
model.Name = "Mehmet";
model.Surname = "Erdoğdu";
CookieManager.SetCookieObjectAsJson(HttpContext, "Kullanici" + model.Id, model);
CookieManager.DeleteCookie(HttpContext, "Kullanici" + model.Id);
Kırılamayacak sistem yoktur. Sadece kırılmasını zorlaştırabilirsiniz! Araştırmaya ve yeni teknikler geliştirmeye devam...