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ı isteyebilir. Bu sayfa bir oturumun ne tuttuğunu, ne kadar süre yaşadığını ve UseDoconut()'un varsayılan olarak etkinleştirdiği kontrolleri açıklar.

Bir belge oturumu ne tutar

Her başarılı OpenDocumentAsync çağrısı IMemoryCache içinde bir oturum oluşturur:

  • yüklenmiş format görüntüleyicisi (belge motoru örneği, ayrıştırılmış belgeyi tutar),
  • sayfa başına durum — widget içinde kullanıcının uyguladığı döndürme, çevirme ve açıklama verileri,
  • isteğe bağlı arama indeksi, ilk aramada tembelce oluşturulur (veya web‑farm senaryolarında önceden oluşturulmuş bir .srh dosyasından yüklenir),
  • oturum filigranı, DocOptions.Watermark'tan.

Ömür

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

csharp
// A short-lived session for a one-shot preview
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

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

Yerleşik token bağlama

UnsafeMode = false (varsayılan) ile, OpenDocumentAsync yeni tokenı, onu açan HTTP isteğinin ASP.NET oturumuna bağlar; bu oturuma bir secure-{token} işareti yazar. Doconut ara katmanı daha sonra başka 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 yüzden Hızlı Başlangıç, Doconut dalından önce AddSession() + app.UseSession() kullanılmasını şart koşar. İki pratik sonuç:

  • İstemci, sayfa istekleriyle birlikte ASP.NET oturum çerezini göndermelidir. Çerezleri kaldıran çapraz kaynak yapılandırmaları (veya çerez deposu olmayan bir API istemcisi) kontrolü geçemez — bu bir özellik, hata değildir.
  • options.UnsafeMode = true bağlamayı tamamen devre dışı bırakır. Kontrollü senaryolar için (ör. sunucu‑sunucu render) mevcuttur; üretimde false bırakın.

Token bağlama 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 çıkış seçeneği yoktur; UnsafeMode = true ayarı bağlamayı küresel olarak devre dışı bırakır.

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

UnsafeMode false olduğunda, UseDoconut() otomatik olarak sayfa ara katmanından önce DocumentAccessMiddleware 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ğıdakiler sağlandığında yetkilendirir:

  1. token için bir izin mevcutsa,
  2. izin süresi dolmamışsa (izin ömrü belgenin TimeOut değerine eşittir),
  3. istek yapan ASP.NET oturum kimliği, belgeyi açan oturum kimliğiyle eşleşiyorsa,
  4. eğer belgeyi açan kimliği doğrulanmışsa, isteği yapan kullanıcının NameIdentifier talebi de eşleşiyorsa.

Başarısızlıklar 403 döndürür — sayfa/küçük resim isteklerinde PNG hata resmi, diğer durumlarda düz metin olarak. Mesaj ve token sorgu anahtarı DocumentSecurityOptions'tan 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 üzerinden yapılandırın. Oturum durumu mevcut değilse ara katman HTTP 500 ile kapanır: 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 olduğunda, UseDoconut() erişim ara katmanını atlar ve temel işaret kontrolü de devre dışı bırakılır.

İ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 her iki güvenlik katmanında da hemen etkisiz hale gelir.

Üretim için kontrol listesi

  • UnsafeMode = false (varsayılan) tutun — bu global anahtar tokenları oturumlara bağlar.
  • AddSession() kaydedin ve Doconut ara katmanı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.
  • Tokenları asla kaydetmeyin veya paylaşmayın; onları kısa ömürlü kimlik bilgileri olarak değerlendirin.

Bu sayfa yardımcı oldu mu?