الجلسات والأمان
جلسات المستند والتحكم في الوصول
رمز Doconut يحدد مستندًا مفتوحًا. إذا تم خدمة أي طلب يحمل هذا الرمز، فإن من يحصل عليه يمكنه قراءة كل صفحة. توضح هذه الصفحة ما تحتويه جلسة المستند، ومدة بقاءها، وكيف يقرر DocImage.axd من يمكنه رؤية صفحاته — على خادم واحد وفي مزرعة ويب.
ما تحتويه جلسة المستند
كل OpenDocumentAsync ناجح ينشئ جلسة واحدة، تُحفظ في الذاكرة:
- المُعَرض المنسق المحمَّل — نسخة المحرك التي تحتفظ بالمستند المُحلَّل،
- حالة كل صفحة — الدوران، الانعكاسات، وبيانات التعليقات التي يضيفها المستخدم في الواجهة،
- فهرس البحث الاختياري، يُبنى عند أول بحث (أو يُحمَّل من ملف
.srhمُسبق الإنشاء)، - الـ watermark الخاص بالجلسة من
DocOptions.Watermark.
مدة الجلسة
تنتهي الجلسات بناءً على نافذة منزلقة: دقائق DocOptions.TimeOut (الافتراضي 60)، تُعاد ضبطها بكل طلب يقدم الرمز. عندما تنتهي الجلسة — إما بانتهاء المهلة أو عبر CloseDocument(token) — يتم تحرير محرك المستند وتحرير الذاكرة فورًا.
// A short-lived session for a one-shot preview
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });طلب يحمل رمزًا منتهي الصلاحية يحصل على صورة خطأ تُظهر النص Document session not found. Please re-open document. يجب على الصفحة إعادة فتح المستند للحصول على رمز جديد. على خادم واحد، يؤدي إعادة تدوير مجموعة التطبيقات إلى إنهاء كل الجلسات أيضًا.
تُقدَّم الصفحات فقط للجلسة التي فتحتها
مع UnsafeMode = false — الإعداد الافتراضي — يمنح فتح المستند الوصول إلى جلسة ASP.NET للطلب الذي فتحه، عبر كتابة إدخال secure-{token} في تلك الجلسة. يتطلب DocImage.axd حالة الجلسة نفسها، ويقدم الصفحة فقط عندما تحتوي جلسة الطلب على ذلك الإدخال. أي متصفح آخر يقدم نفس الرمز يحصل على صورة خطأ تُظهر النص You Are Not Authorized To View This Page.
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;
});ثلاث نتائج عملية:
- نقطة النهاية المفتوحة تحتاج إلى حالة الجلسة. وحدات تحكم MVC وصفحات Web Forms تمتلكها افتراضيًا. لا يمتلك
IHttpHandlerمخصص ذلك إلا إذا نفّذSystem.Web.SessionState.IRequiresSessionState. إذا تم الفتح دون جلسة، لا شيء يُمنح، لذا يعرض العارض "You Are Not Authorized To View This Page." على كل صفحة. - يجب أن تظل حالة الجلسة مفعلة.
<sessionState mode="Off" />فيWeb.configيعطل كلًا من الإذن والتحقق، وتُرفض كل صفحة. - يجب أن يرسل المتصفح ملف تعريف الارتباط الخاص بالجلسة. طلبات الواجهة هي من نفس الأصل، لذا تحمل
ASP.NET_SessionIdتلقائيًا. عميل بدون ملف تعريف الارتباط — سكريبت، اتصال خادم إلى خادم، إعداد عبر أصل يزيل ملفات الارتباط — يُرفض. هذه هي الميزة التي تعمل.
UnsafeMode = true يوقف الفحص: أي طلب يحمل الرمز يُخدم. هو مفتاح عالمي واحد لكل مستند، دون إمكانية تجاوز لكل مستند. اتركه false.
إلغاء الترخيص
CloseDocument(token) يفعل أكثر من تحرير الذاكرة: يزيل إدخال secure-{token} من جلسة الطلب الحالي ويلغي الرمز، لذا يُرفض الرمز المغلق فورًا.
مزارع الويب: تذاكر موقعة
في مزرعة، قد يصل الطلب التالي إلى خادم لم يرَ المستند أبدًا، في عملية عامل مختلفة، مع جلسة ASP.NET خاصة به. لا يمكن لمنح الجلسة متابعته. يستبدل الوضع الموزع ذلك بـ تذكرة موقعة مرتبطة بالمتصفح: كل عقدة تشارك مخزنًا واحدًا لجلسات المستند ومفتاح توقيع واحد، ويقبل DocImage.axd طلبًا عندما تكون تذكرته صالحة لذلك الرمز، لذلك المتصفح، وعند تسجيل دخول المستخدم — لذلك المستخدم.
الإعداد، متطابق على كل عقدة:
// 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
}));ثم تقوم نقطة النهاية المفتوحة بربط التذكرة بالمتصفح قبل الفتح، وتعيد التذكرة مع الرمز:
- ضبط
DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(System.Web.HttpContext.Current, securityOptions)— يُصدر ملف تعريف الارتباطdoconut-clientالمرتبط بالتذكرة — وDocOptions.UserId = DoconutFarmBinding.ResolveUserId(System.Web.HttpContext.Current); - بعد
OpenDocumentAsync، أعدviewer.AccessTokenإلى جانب الرمز; - في الصفحة، مرّر كليهما إلى الواجهة:
objViewer.View(token, access).
Doconut.MvcSample.WebFarm في حزمة العينات هو عقدة مزرعة كاملة وقابلة للتشغيل، ودليل الهجرة المجاور يشرح كل خطوة.
احتفظ بمفتاح التوقيع خارج التحكم في المصدر: فهو يوقع التذاكر ويشفّر المستندات في المخزن المشترك. عقدة بمفتاح مختلف ترفض كل تذكرة أصدرها الآخرون.
اختبر المزرعة بمتصفح حقيقي، أو سكريبت يحتفظ بملفات الارتباط. عميل بدون ملف تعريف الارتباط doconut-client لا يحصل على رد 401: يتلقى صورة الخطأ "غير مصرح" بحالة 200، بحجم حوالي 2 كيلوبايت، بينما صفحة حقيقية تكون بعشرات إلى مئات الكيلوبايت.
قائمة التحقق للإنتاج
- احتفظ بـ
UnsafeMode = false(الإعداد الافتراضي). - افتح المستندات من طلبات تمتلك حالة الجلسة، ولا تقم أبدًا بإيقاف حالة الجلسة.
- تأكد من وصول ملف تعريف الارتباط الخاص بالجلسة إلى
DocImage.axd(نفس الأصل، HTTPS، سياسةSameSiteالتي تسمح بذلك). - في المزرعة، استخدم الوضع الموزع بمفتاح توقيع واحد مشترك بين جميع العقد.
- استدعِ
CloseDocumentعندما يغادر المستخدم المستند — سيفيد ذلك الذاكرة والأمان. - لا تسجِّل أو تشارك الرموز أبداً؛ اعتبرها بيانات اعتماد قصيرة الأجل.
هل كانت هذه الصفحة مفيدة؟