Oturumlar ve Güvenlik

Belge oturumları ve erişim kontrolü

Bir Doconut belirteci açık bir belgeyi tanımlar. Bu belirteci taşıyan herhangi bir istek hizmet edilirse, onu elde eden her sayfayı okuyabilir. Bu sayfa, bir belge oturumunun ne tuttuğunu, ne kadar süre yaşadığını ve DocImage.axd'nin sayfaları kimlerin görebileceğine — tek bir sunucuda ve bir web çiftliğinde — nasıl karar verdiğini açıklar.

Bir belge oturumunun neler tuttuğu

Her başarılı OpenDocumentAsync bir oturum oluşturur ve bellek içinde tutulur:

  • yüklenmiş format görüntüleyici — ayrıştırılmış belgeyi tutan motor ö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 dizini, ilk aramada oluşturulan (veya önceden oluşturulmuş bir .srh dosyasından yüklenen),
  • DocOptions.Watermark'tan gelen oturum filigranı.

Ömür

Oturumlar kayan pencere üzerinden sona erer: DocOptions.TimeOut dakikası (varsayılan 60), belirteci sunan her istekle sıfırlanır. Bir oturum sona erdiğinde — zaman aşımıyla ya da CloseDocument(token) ile — belge motoru serbest bırakılır ve belleği hemen temizlenir.

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

Süresi dolmuş bir belirteçle gelen istek, Document session not found. Please re-open document. metnini içeren bir hata resmi alır. Sayfa, yeni bir belirteç almak için belgeyi tekrar açmalıdır. Tek bir sunucuda, uygulama havuzunun yeniden başlatılması da tüm oturumları sonlandırır.

Sayfalar yalnızca onları açan oturuma sunulur

UnsafeMode = false — varsayılan — olduğunda bir belge açmak, belgeyi açan isteğin ASP.NET oturumuna bir secure-{token} girdisi yazarak erişim izni verir. DocImage.axd kendisinin oturum durumuna ihtiyaç duyar ve yalnızca istek yapan oturum bu girdiyi taşıyorsa sayfayı sunar. Aynı belirteci sunan başka bir tarayıcı, You Are Not Authorized To View This Page. metnini içeren bir hata resmi alır.

csharp
Doconut.DoconutHost.Initialize(options =>
{
    // false (the default): DocImage.axd serves a page only to the ASP.NET session that opened
    // the document. The handler asks for session state itself; it only needs the site not to
    // turn session state off in Web.config.
    options.UnsafeMode = false;
});

Üç pratik sonuç:

  • Açma uç noktası oturum durumuna ihtiyaç duyar. MVC denetleyicileri ve Web Forms sayfaları bunu varsayılan olarak sağlar. Özel bir IHttpHandler oturum durumunu yalnızca System.Web.SessionState.IRequiresSessionState uygularsa alır. Oturum olmadan çalışan bir açma işlemi hiçbir şey veremez, bu yüzden görüntüleyici her sayfada “You Are Not Authorized To View This Page.” mesajını gösterir.
  • Oturum durumu açık kalmalıdır. Web.config içindeki <sessionState mode="Off" /> hem izni hem de kontrolü devre dışı bırakır ve tüm sayfalar reddedilir.
  • Tarayıcı oturum çerezini göndermelidir. Widget istekleri aynı kökenden olduğundan ASP.NET_SessionId otomatik olarak taşınır. Çerez deposu olmayan bir istemci — bir betik, sunucu‑sunucu çağrısı, çerezleri kaldıran çapraz‑köken yapı — reddedilir. Bu, özelliğin çalışmasıdır.

UnsafeMode = true kontrolü kapatır: belirteci taşıyan herhangi bir istek hizmet edilir. Bu, her belge için tek bir global anahtardır ve belge bazında geçersiz kılma seçeneği yoktur. false bırakın.

İptal

CloseDocument(token) yalnızca belleği serbest bırakmakla kalmaz; mevcut isteğin oturumundan secure-{token} girdisini kaldırır ve belirteci iptal eder, böylece kapatılan bir belirteç anında reddedilir.

Web çiftlikleri: imzalı biletler

Bir çiftlikte sonraki istek, belgeyi hiç görmemiş, farklı bir işçi sürecinde ve kendi ASP.NET oturumuna sahip bir sunucuya düşebilir. Oturum izni onu takip edemez. Dağıtık mod, bunu tarayıcıya bağlı imzalı bir bilet ile değiştirir: her düğüm belge oturumları için tek bir depolama ve tek bir imzalama anahtarı paylaşır, ve DocImage.axd bilet, belirteç, tarayıcı ve — kullanıcı oturum açmışsa — kullanıcı için geçerli olduğunda isteği kabul eder.

Kurulum, her düğümde aynı:

csharp
// Global.asax.cs - Application_Start
Doconut.DoconutHost.Initialize(
    options => options.UnsafeMode = false,     // the ticket check only runs when this is false
    services => services.AddDoconutDistributed(d =>
    {
        d.Store             = CloudLocation.FileShare;
        d.FileShareRootPath = @"\\fileserver\doconut-shared";  // a folder every node can reach
        d.SigningKey        = farmKey;                          // at least 32 bytes, the SAME on every node
    }));

Açma uç noktası, belgeyi açmadan önce bileti tarayıcıya bağlar ve belirteçle birlikte bileti döndürür:

  • DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(System.Web.HttpContext.Current, securityOptions) ayarlayın — bu, bilete bağlı doconut-client çerezini oluşturur — ve DocOptions.UserId = DoconutFarmBinding.ResolveUserId(System.Web.HttpContext.Current);
  • OpenDocumentAsync sonrası, belirteçle birlikte viewer.AccessToken değerini döndürün;
  • sayfada, ikisini de widget’a gönderin: objViewer.View(token, access).

Doconut.MvcSample.WebFarm, örnek paketinde tam ve çalıştırılabilir bir çiftlik düğümüdür; yanındaki geçiş kılavuzu her adımı açıklar.

İmzalama anahtarını kaynak kontrolünden uzak tutun: hem biletleri imzalar hem de paylaşılan depodaki belgeleri şifreler. Farklı bir anahtara sahip bir düğüm, diğerlerinin oluşturduğu tüm biletleri reddeder.

Bir çiftliği gerçek bir tarayıcıyla ya da çerezleri koruyan bir betikle test edin. doconut-client çerezi olmayan bir istemciye 401 yanıtı verilmez; bunun yerine 200 durum kodlu “yetkisiz” hata resmi (yaklaşık 2 KB) döner; gerçek bir sayfa ise ondalıklarla yüzlerce kilobayt olur.

Üretim kontrol listesi

  • UnsafeMode = false (varsayılan) tutun.
  • Oturum durumu olan isteklerden belge açın ve oturum durumunu asla kapatmayın.
  • Oturum çerezinin DocImage.axd'ye ulaştığından emin olun (aynı köken, HTTPS, izin veren bir SameSite politikası).
  • Çiftlikte, her düğümün paylaştığı tek bir imzalama anahtarıyla dağıtık modu kullanın.
  • Kullanıcı belgeyi terk ettiğinde CloseDocument çağırın — hem bellek hem de güvenlik açısından faydalıdır.
  • Belirteçleri asla kaydetmeyin veya paylaşmayın; bunları kısa ömürlü kimlik bilgileri olarak ele alın.

Bu sayfa yardımcı oldu mu?