เซสชันและความปลอดภัย
เซสชันเอกสารและการควบคุมการเข้าถึง
โทเคนของ Doconut มีพลังมาก: ผู้ที่นำเสนอโทเคนนี้สามารถขอรับทุกหน้าของเอกสารได้ หากโทเคนไม่ได้ถูกผูกกับเซสชันที่เปิดเอกสาร หน้านี้อธิบายว่าเซสชันเก็บอะไรไว้ มีอายุการใช้งานเท่าใด และการตรวจสอบที่ UseDoconut() เปิดใช้งานโดยค่าเริ่มต้น
สิ่งที่เซสชันเอกสารเก็บไว้
แต่ละการเรียก OpenDocumentAsync ที่สำเร็จจะสร้างเซสชันหนึ่งใน IMemoryCache:
- loaded format viewer (อินสแตนซ์เอนจิ้นเอกสารที่ถือเอกสารที่แปลงแล้ว)
- per-page state — การหมุน, การพลิก, และข้อมูลคำอธิบายที่ผู้ใช้ใส่ในวิดเจ็ต
- search index (ตัวเลือก) ที่สร้างแบบ lazy ในการค้นหาครั้งแรก (หรือโหลดจากไฟล์
.srhที่สร้างไว้ล่วงหน้าในสถานการณ์เว็บฟาร์ม) - watermark ของเซสชันจาก
DocOptions.Watermark
อายุการใช้งาน
เซสชันหมดอายุตาม sliding window: DocOptions.TimeOut นาที (ค่าเริ่มต้น 60) ซึ่งจะรีเซ็ตทุกครั้งที่มีคำขอที่นำโทเคนมาใช้ เมื่อเซสชันถูกขับออก — ไม่ว่าจะโดยการหมดอายุหรือโดย CloseDocument(token) — คอลแบ็กการขับออกจะทำลายเอนจิ้นเอกสารและคืนหน่วยความจำที่เกี่ยวข้องทันที
// เซสชันอายุสั้นสำหรับการพรีวิวครั้งเดียว
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });คำขอที่ใช้โทเคนที่หมดอายุจะได้รับรูปภาพข้อผิดพลาดที่แสดงข้อความ Document session not found. Please re-open document. — ลูกค้าต้องเปิดเอกสารใหม่เพื่อรับโทเคนที่สดใหม่
การผูกโทเคนในตัว
เมื่อ UnsafeMode = false (ค่าเริ่มต้น) OpenDocumentAsync จะผูกโทเคนใหม่กับ ASP.NET session ของคำขอ HTTP ที่เปิดเอกสารนั้น โดยเขียนมาร์คเกอร์ secure-{token} ลงในเซสชันนั้น จากนั้นมิดเดิลแวร์ของ Doconut จะปฏิเสธการให้บริการหน้าใด ๆ กับเซสชันเบราว์เซอร์อื่น:
- เบราว์เซอร์/เซสชันที่แตกต่างนำโทเคนที่ถูกขโมยมา → รูปภาพข้อผิดพลาด
You Are Not Authorized To View This Page. - มิดเดิลแวร์เซสชันไม่ได้ลงทะเบียน → HTTP 500
Session middleware not configured. Call UseSession() before UseDoconut().
นี่คือเหตุผลที่ Quick Start ย้ำให้ใช้ AddSession() + app.UseSession() ก่อนสาขา middleware ของ Doconut มีผลตามมาสองประการ:
- ลูกค้าต้องส่ง session cookie ของ ASP.NET ไปพร้อมกับคำขอหน้าเว็บ การตั้งค่าข้ามต้นทางที่ลบคุกกี้ (หรือไคลเอนต์ API ที่ไม่มีคุกกี้) จะทำให้การตรวจสอบล้มเหลว — นี่คือการทำงานตามที่ออกแบบ ไม่ใช่บั๊ก
options.UnsafeMode = trueปิดการผูกโทเคนทั้งหมด มีไว้สำหรับสถานการณ์ที่ควบคุมได้ (เช่น การเรนเดอร์แบบ server‑to‑server) ควรตั้งเป็นfalseในการผลิต
การผูกโทเคนถูกควบคุมโดยสวิตช์ระดับโลก UnsafeMode เพียงอย่างเดียว — เปิดโดยค่าเริ่มต้น (UnsafeMode = false) และใช้กับทุกเซสชัน ไม่มีการยกเว้นตามเอกสาร; การตั้งค่า UnsafeMode = true จะปิดการผูกโทเคนทั่วทั้งระบบ
การให้สิทธิ์เข้าถึงและผู้ใช้ที่ผ่านการรับรอง
เมื่อ UnsafeMode เป็น false UseDoconut() จะใส่ DocumentAccessMiddleware เข้าไปโดยอัตโนมัติก่อน middleware ของหน้า อย่าลงทะเบียนซ้ำ เมื่อคำขอมีโทเคน มิดเดิลแวร์จะค้นหา access grant ที่บันทึกไว้เมื่อตอนเปิดเอกสารและจะอนุญาตก็ต่อเมื่อเงื่อนไขต่อไปนี้ทั้งหมดเป็นจริง:
- มีการให้สิทธิ์สำหรับโทเคนนั้น
- สิทธิ์ยังไม่หมดอายุ (อายุสิทธิ์เท่ากับ
TimeOutของเอกสาร) - ID ของเซสชัน ASP.NET ที่ร้องขอตรงกับเซสชันที่เปิดเอกสาร
- หากผู้เปิดเอกสารผ่านการรับรอง ค่าสิทธิ์
NameIdentifierของผู้ใช้ที่ร้องขอก็ต้องตรงกัน
หากตรวจสอบไม่ผ่านจะคืนค่า 403 — เป็นรูปภาพ PNG สำหรับคำขอหน้า/thumbnail, หรือเป็นข้อความธรรมดาสำหรับกรณีอื่น ข้อความและคีย์ query ของโทเคนมาจาก DocumentSecurityOptions (TokenQueryKey ค่าเริ่มต้น "token"; UnauthorizedMessage ค่าเริ่มต้น "You Are Not Authorized To View This Page.") สามารถกำหนดค่าเหล่านี้ผ่าน DI ของ ASP.NET Core ก่อนสร้างแอป หากสถานะเซสชันไม่พร้อมใช้งาน middleware จะปิดการทำงานและคืน HTTP 500: ASP.NET Session is required for Doconut document security.
builder.Services.Configure<Doconut.Security.DocumentSecurityOptions>(options =>
{
options.TokenQueryKey = "token";
options.UnauthorizedMessage = "You Are Not Authorized To View This Page.";
});มิดเดิลแวร์หลักของหน้า จะตรวจสอบมาร์คเกอร์ secure-{token} ของเซสชันก่อนให้บริการเอกสาร หากตั้งค่า UnsafeMode = true UseDoconut() จะข้าม middleware การให้สิทธิ์และการตรวจสอบมาร์คเกอร์หลักก็จะถูกปิดด้วยเช่นกัน
การเพิกถอน
CloseDocument(token) ไม่ได้เพียงแค่คืนหน่วยความจำ — ยังลบมาร์คเกอร์ secure-{token} และเพิกถอน access grant ด้วย ทำให้โทเคนที่ถูกปิดใช้งานตายทั้งสองระดับความปลอดภัยทันที
รายการตรวจสอบสำหรับการผลิต
- รักษา
UnsafeMode = false(ค่าเริ่มต้น) — สวิตช์ระดับโลกนี้เป็นตัวผูกโทเคนกับเซสชัน - ลงทะเบียน
AddDistributedMemoryCache()(แอป MVC และ Razor Pages มีอยู่แล้ว) และAddSession()แล้วเรียกapp.UseSession()ก่อนสาขา middleware ของ Doconut - ตรวจสอบให้แน่ใจว่านโยบายคุกกี้ของเซสชันอนุญาตให้วิดเจ็ตส่งคุกกี้ไปด้วย (
SameSite, HTTPS) - ใช้
CloseDocumentเมื่อผู้ใช้ออกจากเอกสาร — จะช่วยประหยัดหน่วยความจำและเพิ่มความปลอดภัย - ห้ามบันทึกหรือแชร์โทเคน; ปฏิบัติเช่นเป็นข้อมูลประจำตัวอายุสั้น
หน้านี้เป็นประโยชน์หรือไม่?