Oturumlar ve Güvenlik

Belge oturumları ve erişim kontrolü

Bir Doconut token'ı güçlüdür: onu sunan herkes, açılış oturumuna bağlanmamış olsaydı belgenin her sayfasını talep edebilirdi. Bu sayfa, bir oturumun ne tuttuğunu, ne kadar süre yaşadığını ve UseDoconut() tarafından varsayılan olarak etkinleştirilen kontrolleri açıklar.

Bir belge oturumu ne tutar

Başarılı bir OpenDocumentAsync, IMemoryCache içinde bir oturum oluşturur:

  • yüklü format görüntüleyicisi (ayrıştırılmış belgeyi tutan belge motoru örneği),
  • sayfa başına durum — döndürme, çevirme ve kullanıcının widget içinde uyguladığı ek açıklama verileri,
  • isteğe bağlı arama indeksi, ilk aramada tembelce oluşturulur (veya sayfalar paylaşılan depolamadan sunulduğunda önceden oluşturulmuş .srh dosyasından yüklenir),
  • oturum filigranı DocOptions.Watermark'den.

Ömür

Oturumlar kaydırmalı pencere üzerinden süresi dolar: DocOptions.TimeOut dakika (varsayılan 60), token sunan her istekle sıfırlanır. Bir oturum, süresi dolduğunda ya da CloseDocument(token) tarafından atıldığında, atılma geri çağrısı belge motorunu kapatır ve ilişkili belleği hemen serbest bırakır.

csharp
// Tek seferlik önizleme için kısa ömürlü bir oturum
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Süresi dolmuş bir token ile yapılan istek, Document session not found. Please re-open document. okuyan bir hata resmi alır — istemcinin yeni bir token elde etmek için yeniden açması gerekir.

Yerleşik token bağlaması

UnsafeMode = false (varsayılan) ile, OpenDocumentAsync yeni token'ı, onu açan HTTP isteğinin ASP.NET oturumuna bir secure-{token} işareti yazarak bağlar. Doconut ara katmanı daha sonra başka herhangi bir tarayıcı oturumuna sayfa sunmayı reddeder:

  • Çalınmış bir token sunan farklı tarayıcı/oturum → hata resmi You Are Not Authorized To View This Page.
  • Oturum ara katmanı kaydedilmemiş → HTTP 500 Session middleware not configured. Call UseSession() before UseDoconut().

Bu, Quick Start'ın Doconut dalından önce AddSession() + app.UseSession() zorunlu kılmasının nedenidir. İki pratik sonuç:

  • İstemci, sayfa istekleriyle birlikte ASP.NET oturum çerezini göndermelidir. Çerezleri temizleyen çapraz köken yapılandırmaları (veya çerez kutusu olmayan bir API istemcisi) kontrolü başarısız kılar — bu bir özellik, hata değildir.
  • options.UnsafeMode = true bağlamayı tamamen devre dışı bırakır. Kontrollü senaryolar için vardır; üretimde tek bir düğümde false bırakın.

Yazımına dikkat edin. Önceki .NET Standard kütüphanesi bu özelliği UnSafeMode olarak adlandırıyordu ve ara katmana aktarılıyordu; burada ise UnsafeMode ve AddDoconut() içinde bir kez ayarlanıyor.

Token bağlaması yalnızca bu global UnsafeMode anahtarıyla kontrol edilir — varsayılan olarak açıktır (UnsafeMode = false) ve her oturuma uygulanır. Belge başına bir devre dışı bırakma seçeneği yoktur; UnsafeMode = true ayarı bağlamayı global olarak devre dışı bırakır.

Erişim izinleri ve kimliği doğrulanmış kullanıcılar

UnsafeMode false olduğunda, UseDoconut() belge erişim ara katmanını sayfa ara katmanından önce otomatik olarak ekler. İkinci kez kaydetmeyin. Bir istek token taşıdığında, belgenin açıldığı sırada kaydedilen erişim iznini arar ve yalnızca aşağıdakilerin hepsi sağlandığında yetkilendirir:

  1. token için bir izin mevcut,
  2. süresi dolmamış (izin ömrü = belgenin TimeOut),
  3. talep eden ASP.NET oturum kimliği, belgeyi açan oturum kimliğiyle eşleşiyor,
  4. açan kimliği doğrulanmışsa, talep eden kullanıcının NameIdentifier talebi de eşleşiyor.

Başarısızlıklar 403 döndürür — sayfa/küçük resim istekleri için PNG hata resmi, aksi takdirde düz metin olarak. Mesaj ve token sorgu anahtarı DocumentSecurityOptions'den gelir (TokenQueryKey, varsayılan "token"; UnauthorizedMessage, varsayılan "You Are Not Authorized To View This Page."). Bu seçenekleri uygulamayı oluşturmadan önce ASP.NET Core DI aracılığıyla yapılandırın. Oturum durumu mevcut değilse ara katman HTTP 500 ile kapalı şekilde başarısız olur: ASP.NET Session is required for Doconut document security.

csharp
builder.Services.Configure<Doconut.Security.DocumentSecurityOptions>(options =>
{
    options.TokenQueryKey = "token";
    options.UnauthorizedMessage = "You Are Not Authorized To View This Page.";
});

Ana sayfa ara katmanı, belgeyi sunmadan önce secure-{token} oturum işaretini doğrular. UnsafeMode = true ile, UseDoconut() erişim ara katmanını atlar ve temel işaret kontrolü de devre dışı bırakılır.

Birden fazla düğümde güvenlik

Oturuma bağlı token'lar, bir sayfayı sunan düğümün belgeyi açan isteği de gördüğünü varsayar. Bu varsayım, birden fazla düğüm aynı belgeleri paylaşılan depolamadan sunarken geçerli değildir: bir sayfa isteği, açma isteğini hiç görmemiş bir düğüme düşebilir ve oturum başına kontrol bunu reddeder.

Cevap, belgeleri korumasız bırakmamaktır. AddDoconutDistributedDocumentSecurity(...) üzerinden imzalı erişim biletleri kullanın; bu, oturum kontrolünü her düğümün bağımsız olarak doğrulayabileceği bir kimlik bilgisiyle değiştirir. Tam düzenleme Dağıtılmış Dağıtımlar sayfasında bulunur.

İptal

CloseDocument(token) sadece belleği serbest bırakmaz — aynı zamanda secure-{token} işaretini kaldırır ve erişim iznini iptal eder, böylece kapatılan bir token iki güvenlik katmanında da hemen etkisiz hale gelir.

Üretim için kontrol listesi

  • Tek bir düğümde UnsafeMode = false (varsayılan) tutun — bu global anahtar token'ları oturumlara bağlayan şeydir.
  • AddDistributedMemoryCache() (MVC ve Razor Pages uygulamaları zaten buna sahiptir) ve AddSession() kaydedin ve Doconut ara katman dalından önce app.UseSession() çağırın.
  • Oturum çerez politikası, widget isteklerinin çerezi taşımasına izin verdiğinden emin olun (SameSite, HTTPS).
  • Kullanıcı belgeyi terk ettiğinde CloseDocument kullanın — hem bellek hem de güvenlik fayda sağlar.
  • Token'ları asla kaydetmeyin veya paylaşmayın; onları kısa ömürlü kimlik bilgileri olarak ele alın.
  • Paylaşılan depolamadan mı sunuyorsunuz? Korumasız belgeleri kabul etmek yerine imzalı erişim biletlerine geçin.

Bu sayfa yardımcı oldu mu?