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
.srhdosyası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.
// 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.
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
IHttpHandleroturum durumunu yalnızcaSystem.Web.SessionState.IRequiresSessionStateuygularsa 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.configiç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_SessionIdotomatik 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ı:
// 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 — veDocOptions.UserId = DoconutFarmBinding.ResolveUserId(System.Web.HttpContext.Current);OpenDocumentAsyncsonrası, belirteçle birlikteviewer.AccessTokendeğ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 birSameSitepolitikası). - Ç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?