เซสชันและความปลอดภัย

เซสชันเอกสารและการควบคุมการเข้าถึง

โทเค็น Doconut มีพลังมาก: ผู้ที่นำเสนอโทเค็นนั้นสามารถขอรับทุกหน้าของเอกสารได้ หากไม่ได้ผูกกับเซสชันที่เปิดอยู่ หน้านี้อธิบายว่าเซสชันเก็บอะไรไว้, อายุการใช้งานเป็นเท่าไหร่, และการตรวจสอบที่ UseDoconut() เปิดใช้งานโดยค่าเริ่มต้น

สิ่งที่เซสชันเอกสารเก็บไว้

แต่ละการเรียก OpenDocumentAsync ที่สำเร็จจะสร้างเซสชันหนึ่งใน IMemoryCache:

  • ตัวดูรูปแบบที่โหลดแล้ว (อินสแตนซ์เอนจินเอกสารที่ถือเอกสารที่แยกวิเคราะห์แล้ว),
  • สถานะต่อหน้า — การหมุน, การพลิก, และข้อมูลคำอธิบายที่ผู้ใช้ใส่ในวิดเจ็ต,
  • ดัชนีการค้นหา แบบเลือกใช้, สร้างแบบ lazy ในการค้นหาครั้งแรก (หรือโหลดจากไฟล์ .srh ที่สร้างล่วงหน้าในสถานการณ์เว็บฟาร์ม),
  • ลายน้ำ ของเซสชันจาก DocOptions.Watermark.

อายุการใช้งาน

เซสชันหมดอายุตาม หน้าต่างเลื่อน: DocOptions.TimeOut นาที (ค่าเริ่มต้น 60) ซึ่งรีเซ็ตโดยทุกคำขอที่นำเสนอโทเค็น เมื่อเซสชันถูกขับออก — ไม่ว่าจะโดยการหมดอายุหรือโดย CloseDocument(token) — คอลแบ็กการขับออกจะทำลายเอนจินเอกสารและปล่อยหน่วยความจำที่เกี่ยวข้องทันที

csharp
// 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 (ค่าเริ่มต้น) OpenDocumentAsync จะผูกโทเค็นใหม่กับ เซสชัน ASP.NET ของคำขอ 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() ก่อนสาขา Doconut ผลลัพธ์ที่เป็นประโยชน์สองประการ:

  • ลูกค้าต้องส่ง คุกกี้เซสชัน ASP.NET พร้อมกับคำขอหน้า การตั้งค่าข้ามต้นทางที่ลบคุกกี้ (หรือไคลเอนต์ API ที่ไม่มีคุกกี้) จะทำให้การตรวจสอบล้มเหลว — นั่นคือฟีเจอร์ทำงาน, ไม่ใช่บั๊ก
  • options.UnsafeMode = true ปิดการผูกโดยสมบูรณ์ ใช้ในสถานการณ์ที่ควบคุมได้ (เช่น การเรนเดอร์ server‑to‑server); ควรตั้งเป็น false ในการผลิต

การผูกโทเค็นถูกควบคุมโดยสวิตช์ทั่วโลก UnsafeMode นี้เท่านั้น — เปิดโดยค่าเริ่มต้น (UnsafeMode = false) และใช้กับทุกเซสชัน ไม่มีการยกเว้นต่อเอกสาร; การตั้งค่า UnsafeMode = true จะปิดการผูกทั่วทั้งระบบ

การให้สิทธิ์เข้าถึงและผู้ใช้ที่ผ่านการรับรองตัวตน

เมื่อ UnsafeMode เป็น false UseDoconut() จะใส่ DocumentAccessMiddleware อัตโนมัติก่อนมิดเดิลแวร์หน้า อย่าลงทะเบียนซ้ำ เมื่อคำขอมีโทเค็น มิดเดิลแวร์จะค้นหาการ ให้สิทธิ์เข้าถึง ที่บันทึกไว้เมื่อเอกสารถูกเปิดและอนุญาตเฉพาะเมื่อเงื่อนไขต่อไปนี้เป็นจริงทั้งหมด:

  1. มีการให้สิทธิ์สำหรับโทเค็นนั้น,
  2. การให้สิทธิ์ยังไม่หมดอายุ (อายุการให้สิทธิ์ = TimeOut ของเอกสาร),
  3. ID เซสชัน ASP.NET ที่ร้องขอตรงกับเซสชันที่เปิดเอกสาร,
  4. หากผู้เปิดเอกสารผ่านการรับรองตัวตน, ค่าข้อเรียกร้อง NameIdentifier ของผู้ร้องขอก็ต้องตรงกันด้วย

หากตรวจสอบไม่ผ่านจะคืนค่า 403 — เป็นภาพ PNG ข้อผิดพลาดสำหรับคำขอหน้า/ภาพย่อ, เป็นข้อความธรรมดาสำหรับกรณีอื่น ๆ ข้อความและคีย์การสอบถามโทเค็นมาจาก DocumentSecurityOptions (TokenQueryKey, ค่าเริ่มต้น "token"; UnauthorizedMessage, ค่าเริ่มต้น "You Are Not Authorized To View This Page.") กำหนดค่าเหล่านี้ผ่าน DI ของ ASP.NET Core ก่อนสร้างแอป หากสถานะเซสชันไม่พร้อมใช้งาน มิดเดิลแวร์จะปิดการทำงานด้วย HTTP 500: 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.";
});

มิดเดิลแวร์หน้าหลักจะตรวจสอบมาร์กเกอร์ secure-{token} ของเซสชันก่อนให้บริการเอกสาร หาก UnsafeMode = true UseDoconut() จะข้ามมิดเดิลแวร์การเข้าถึงและการตรวจสอบมาร์กเกอร์หลักก็จะถูกปิดด้วยเช่นกัน

การเพิกถอน

CloseDocument(token) ไม่ได้เพียงแค่ปล่อยหน่วยความจำ — มันยังลบมาร์กเกอร์ secure-{token} และเพิกถอนการให้สิทธิ์เข้าถึง ทำให้โทเค็นที่ปิดแล้วตายบนชั้นความปลอดภัยทั้งสองทันที

เช็คลิสต์สำหรับการผลิต

  • รักษา UnsafeMode = false (ค่าเริ่มต้น) — สวิตช์ทั่วโลกนี้เป็นสิ่งที่ผูกโทเค็นกับเซสชัน
  • ลงทะเบียน AddSession() และเรียก app.UseSession() ก่อนสาขามิดเดิลแวร์ Doconut
  • ตรวจสอบนโยบายคุกกี้เซสชันของคุณให้วิดเจ็ตส่งคุกกี้ได้ (SameSite, HTTPS)
  • ใช้ CloseDocument เมื่อผู้ใช้ออกจากเอกสาร — ทั้งหน่วยความจำและความปลอดภัยจะได้ประโยชน์
  • อย่าเก็บบันทึกหรือแชร์โทเค็น; ปฏิบัติเช่นเป็นข้อมูลประจำตัวที่มีอายุสั้น

หน้านี้เป็นประโยชน์หรือไม่?