Sesi & Keamanan

Sesi dokumen dan kontrol akses

Token Doconut sangat kuat: siapa pun yang menyajikannya dapat meminta setiap halaman dokumen jika tidak terikat pada sesi pembukaan. Halaman ini menjelaskan apa yang disimpan dalam sebuah sesi, berapa lama sesi tersebut hidup, dan pemeriksaan yang diaktifkan secara default oleh UseDoconut().

Apa yang disimpan dalam sesi dokumen

Setiap OpenDocumentAsync yang berhasil membuat satu sesi di IMemoryCache:

  • penampil format yang dimuat (instansi mesin dokumen yang memuat dokumen yang telah diparsing),
  • status per halaman — rotasi, flip, dan data anotasi yang diterapkan pengguna di widget,
  • indeks pencarian opsional, dibangun secara malas pada pencarian pertama (atau dimuat dari berkas .srh yang telah dibangun sebelumnya dalam skenario web‑farm),
  • watermark sesi dari DocOptions.Watermark.

Masa Hidup

Sesi berakhir pada jendela geser: DocOptions.TimeOut menit (bawaan 60), direset oleh setiap permintaan yang menyajikan token. Ketika sebuah sesi dihapus — karena kedaluwarsa atau oleh CloseDocument(token) — callback penghapusan sesi membuang mesin dokumen dan membebaskan memori yang terkait secara langsung.

csharp
// Sesi singkat untuk pratinjau satu kali
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Permintaan dengan token yang kedaluwarsa akan menampilkan gambar error berisi Document session not found. Please re-open document. — klien harus membuka kembali dokumen untuk memperoleh token baru.

Pengikatan token bawaan

Dengan UnsafeMode = false (bawaan), OpenDocumentAsync mengikat token baru ke sesi ASP.NET dari permintaan HTTP yang membukanya, dengan menulis penanda secure-{token} ke dalam sesi tersebut. Middleware Doconut kemudian menolak melayani halaman ke sesi peramban lain:

  • Peramban/sesi yang berbeda menyajikan token yang dicuri → gambar error You Are Not Authorized To View This Page.
  • Middleware sesi tidak terdaftar → HTTP 500 Session middleware not configured. Call UseSession() before UseDoconut().

Inilah mengapa Quick Start menekankan penggunaan AddSession() + app.UseSession() sebelum cabang Doconut. Dua konsekuensi praktis:

  • Klien harus mengirim cookie sesi ASP.NET bersama permintaan halaman. Pengaturan lintas asal yang menghapus cookie (atau klien API tanpa penyimpanan cookie) akan gagal pada pemeriksaan — itu adalah fitur yang berfungsi, bukan bug.
  • options.UnsafeMode = true menonaktifkan pengikatan sepenuhnya. Ini ada untuk skenario terkontrol (mis. rendering server‑ke‑server); biarkan false di produksi.

Pengikatan token dikendalikan sepenuhnya oleh saklar global UnsafeMode ini — aktif secara default (UnsafeMode = false) dan berlaku untuk setiap sesi. Tidak ada opsi keluar per‑dokumen; mengatur UnsafeMode = true menonaktifkan pengikatan secara global.

Hak akses dan pengguna terautentikasi

Ketika UnsafeMode adalah false, UseDoconut() menyisipkan DocumentAccessMiddleware secara otomatis sebelum middleware halaman. Jangan daftarkan lagi. Ketika sebuah permintaan membawa token, ia mencari hak akses yang dicatat saat dokumen dibuka dan mengotorisasi hanya jika semua hal berikut terpenuhi:

  1. terdapat hak akses untuk token tersebut,
  2. hak akses belum kedaluwarsa (masa hidup hak akses = TimeOut dokumen),
  3. ID sesi ASP.NET yang meminta cocok dengan yang membuka dokumen,
  4. jika pembuka terautentikasi, klaim NameIdentifier pengguna yang meminta juga cocok.

Kegagalan mengembalikan 403 — sebagai gambar error PNG untuk permintaan halaman/thumbnail, atau sebagai teks biasa untuk permintaan lain. Pesan dan kunci kueri token diambil dari DocumentSecurityOptions (TokenQueryKey, bawaan "token"; UnauthorizedMessage, bawaan "You Are Not Authorized To View This Page."). Konfigurasikan opsi tersebut melalui DI ASP.NET Core sebelum membangun aplikasi. Jika status sesi tidak tersedia, middleware akan menutup dengan 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.";
});

Middleware inti halaman kemudian memverifikasi penanda sesi secure-{token} sebelum menyajikan dokumen. Dengan UnsafeMode = true, UseDoconut() melewati middleware akses dan pemeriksaan penanda inti juga dinonaktifkan.

Pencabutan

CloseDocument(token) tidak hanya membebaskan memori — ia juga menghapus penanda secure-{token} dan mencabut hak akses, sehingga token yang ditutup menjadi tidak aktif pada kedua lapisan keamanan secara langsung.

Daftar Periksa untuk Produksi

  • Pertahankan UnsafeMode = false (bawaan) — saklar global ini yang mengikat token ke sesi.
  • Daftarkan AddSession() dan panggil app.UseSession() sebelum cabang middleware Doconut.
  • Pastikan kebijakan cookie sesi Anda memungkinkan permintaan widget membawa cookie (SameSite, HTTPS).
  • Gunakan CloseDocument ketika pengguna meninggalkan dokumen — memori dan keamanan keduanya diuntungkan.
  • Jangan pernah mencatat atau membagikan token; perlakukan mereka sebagai kredensial berumur pendek.

Apakah halaman ini membantu?