ASP.NET Core Time Limited Protection

29.03.2022 | dakika okuma

ASP.NET Core'da verilerimiz için belirli bir süreliğine koruma sağlayabiliriz. Örneğin şifrelediğimiz bir verinin çözülmesi için bir dakikalık bir süre tanımlayabiliriz. Yani bu bir dakikalık süre aşılırsa şifreli verinin çözülemeyeceği anlamına gelir. Bunun için DataProtectionAPI kullanılıyor.

İlk önce Startup'da DataProtection'ı aşağıdaki gibi aktif etmemiz gerekli.

    services.AddDataProtection();

Controller'da aşağıdaki gibi IDataProtectionProvider'ı inject ediyoruz.

    public IDataProtectionProvider DataProtectionProvider { get; init; }

public TimeLimitedDataController(IDataProtectionProvider dataProtectionProvider)
{
    DataProtectionProvider = dataProtectionProvider;
}

Şifreleme yapmadan önce bir tane amaç belirtmemiz gerekiyor. Örneğin; Auth Ticket, View State vs. Böylelikle amaca göre client bazında kriptografik bir anahtar oluşturuluyor. Yani AuthTicket ile şifrelediğimiz bir veri, View State ile çözülemiyor. Bu sayede veri izolasyonu ve güvenliği sağlanmış oluyor.

    var dataProtector = DataProtectionProvider.CreateProtector("AuthTicket");

var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();

var payload = "This is an encrypted message for a minute.";

var result = timeLimitedDataProtector.Protect(payload, TimeSpan.FromSeconds(60));

Yukarıdaki örnekte AuthTicket amacı ile şifrelediğimiz veriyi aşağıdaki gibi çözebiliriz.

    string result;

try
{
    var dataProtector = DataProtectionProvider.CreateProtector("AuthTicket");
    var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();

    var payload = "ENCRYPTED_DATA";

    result = timeLimitedDataProtector.Unprotect(payload);
}
catch (CryptographicException ex)
{
    result = ex.Message;
}

return result;

Bir dakikalık süre aşıldıktan sonra şifrelenmiş veri çözülemeyecek ve aşağıdaki gibi bir hata fırlatılacak.

The payload expired at 06/29/2021 14:39:37 +00:00.

Amaçlar zincirleme şeklinde oluşturulabilir. Örneğin multi-tenant bir uygulama geliştiriyorsak; her tenant için ayrı bir izolasyon sağlayabiliriz.

    var dataProtector = DataProtectionProvider.CreateProtector("Tenant1").CreateProtector("AuthTicket");

var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();

var payload = "This is an encrypted message that Tenant1 can see for a minute.";

var result = timeLimitedDataProtector.Protect(payload, TimeSpan.FromSeconds(60));

Tenant1 için şifrelenmiş bir veriyi yine aşağıdaki gibi Tenant1 ile çözebiliriz. Aksi halde aşağıdaki gibi bir hata fırlatılacak.

    string result;

try
{
    var dataProtector = DataProtectionProvider.CreateProtector("Tenant1").CreateProtector("AuthTicket");
    var timeLimitedDataProtector = dataProtector.ToTimeLimitedDataProtector();

    var payload = "ENCRYPTED_DATA";

    result = timeLimitedDataProtector.Unprotect(payload);
}
catch (CryptographicException ex)
{
    result = ex.Message;
}

return result;
The payload was invalid.

Kolay gelsin.

Yazıyı Paylaş

Yorum bırak

Yanıtla

Yanıtlamayı iptal et
Bu site reCAPTCHA tarafından korunmaktadır ve Google Gizlilik Politikası ve Hizmet Şartları geçerlidir. Yorumunuz başarılı şekilde gönderildi reCaptcha doğrulanamadı
Muhabbetle ASP.NET Core ile geliştirildi.