Phiên & Bảo mật

Phiên tài liệu và kiểm soát truy cập

Một token Doconut rất mạnh: bất kỳ ai trình bày nó đều có thể yêu cầu mọi trang của tài liệu nếu nó không được ràng buộc với phiên mở. Trang này giải thích một phiên chứa gì, thời gian tồn tại của nó, và các kiểm tra mà UseDoconut() bật theo mặc định.

Những gì một phiên tài liệu chứa

  • trình xem định dạng đã tải (đối tượng engine tài liệu giữ bản phân tích tài liệu),
  • trạng thái theo trang — xoay, lật và dữ liệu chú thích mà người dùng áp dụng trong widget,
  • chỉ mục tìm kiếm tùy chọn, được xây dựng một cách lười biếng khi thực hiện tìm kiếm lần đầu (hoặc được tải từ tệp .srh đã được tạo sẵn trong các kịch bản web‑farm),
  • đánh dấu bản quyền của phiên lấy từ DocOptions.Watermark.

Thời gian tồn tại

Các phiên hết hạn dựa trên cửa sổ trượt: DocOptions.TimeOut phút (mặc định 60), được đặt lại bởi mỗi yêu cầu trình bày token. Khi một phiên bị loại bỏ — do hết hạn hoặc bởi CloseDocument(token) — callback loại bỏ sẽ giải phóng engine tài liệu và giải phóng bộ nhớ liên quan ngay lập tức.

csharp
// A short-lived session for a one-shot preview
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Một yêu cầu với token đã hết hạn sẽ nhận được hình ảnh lỗi ghi Document session not found. Please re-open document. — client phải mở lại để nhận token mới.

Ràng buộc token tích hợp

Với UnsafeMode = false (mặc định), OpenDocumentAsync ràng buộc token mới với phiên ASP.NET của yêu cầu HTTP đã mở nó, bằng cách ghi một dấu secure-{token} vào phiên đó. Middleware Doconut sau đó từ chối phục vụ các trang cho bất kỳ phiên trình duyệt nào khác:

  • Trình duyệt/phiên khác trình bày token bị đánh cắp → hình ảnh lỗi You Are Not Authorized To View This Page.
  • Middleware phiên không được đăng ký → HTTP 500 Session middleware not configured. Call UseSession() before UseDoconut().

Đây là lý do tại sao Quick Start yêu cầu AddSession() + app.UseSession() trước nhánh Doconut. Hai hậu quả thực tiễn:

  • Client phải gửi cookie phiên ASP.NET cùng với các yêu cầu trang. Các cấu hình cross‑origin mà loại bỏ cookie (hoặc client API không có jar cookie) sẽ không vượt qua kiểm tra — đây là tính năng hoạt động, không phải lỗi.
  • options.UnsafeMode = true sẽ tắt hoàn toàn việc ràng buộc. Tùy chọn này chỉ dành cho các kịch bản kiểm soát (ví dụ: render server‑to‑server); trong môi trường production hãy để nó là false.

Ràng buộc token được kiểm soát duy nhất bằng công tắc toàn cục UnsafeMode — nó bật theo mặc định (UnsafeMode = false) và áp dụng cho mọi phiên. Không có tùy chọn tắt riêng cho từng tài liệu; đặt UnsafeMode = true sẽ tắt ràng buộc trên toàn bộ.

Quyền truy cập và người dùng đã xác thực

Khi UnsafeModefalse, UseDoconut() tự động chèn DocumentAccessMiddleware trước middleware trang. Không đăng ký lại lần nữa. Khi một yêu cầu mang token, nó tra cứu quyền truy cập đã ghi khi tài liệu được mở và chỉ cho phép nếu tất cả các điều kiện sau đều đúng:

  1. đã tồn tại quyền truy cập cho token đó,
  2. quyền truy cập chưa hết hạn (thời gian sống = TimeOut của tài liệu),
  3. ID phiên ASP.NET của yêu cầu khớp với ID phiên đã mở tài liệu,
  4. nếu người mở tài liệu đã xác thực, thì claim NameIdentifier của người dùng yêu cầu cũng phải khớp.

Khi thất bại, trả về 403 — dưới dạng hình ảnh PNG lỗi cho các yêu cầu trang/thumbnail, và dạng văn bản thuần cho các trường hợp khác. Thông báo và khóa truy vấn token được lấy từ DocumentSecurityOptions (TokenQueryKey, mặc định "token"; UnauthorizedMessage, mặc định "You Are Not Authorized To View This Page."). Cấu hình các tùy chọn này qua ASP.NET Core DI trước khi xây dựng ứng dụng. Nếu trạng thái phiên không khả dụng, middleware sẽ đóng lại với 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 trang cốt lõi sau đó xác minh dấu secure-{token} trong phiên trước khi phục vụ tài liệu. Khi UnsafeMode = true, UseDoconut() bỏ qua middleware truy cập và kiểm tra dấu cốt lõi cũng bị tắt.

Thu hồi

CloseDocument(token) không chỉ giải phóng bộ nhớ — nó còn loại bỏ dấu secure-{token} và thu hồi quyền truy cập, vì vậy token đã đóng sẽ chết ngay trên cả hai lớp bảo mật.

Danh sách kiểm tra cho môi trường production

  • Giữ UnsafeMode = false (mặc định) — công tắc toàn cục này là thứ ràng buộc token với phiên.
  • Đăng ký AddSession() và gọi app.UseSession() trước nhánh middleware Doconut.
  • Đảm bảo chính sách cookie phiên cho phép các yêu cầu của widget mang theo cookie (SameSite, HTTPS).
  • Sử dụng CloseDocument khi người dùng rời tài liệu — cả bộ nhớ và bảo mật đều được cải thiện.
  • Không bao giờ ghi log hoặc chia sẻ token; coi chúng như chứng chỉ ngắn hạn.

Trang này có hữu ích không?