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ữ tài liệu đã phân tích),
  • trạng thái mỗi 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 lười biếng khi tìm kiếm lần đầu (hoặc tải từ tệp .srh đã xây dựng trước trong các kịch bản web-farm),
  • đánh dấu nước của phiên từ DocOptions.Watermark.

Thời lượng

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 chứa nội dung Document session not found. Please re-open document. — client phải mở lại để lấy 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ó cookie jar) sẽ không vượt qua kiểm tra — đó là tính năng hoạt động, không phải lỗi.
  • options.UnsafeMode = true tắt hoàn toàn việc ràng buộc. Nó tồn tại cho các kịch bản kiểm soát (ví dụ render server-to-server); để nó là false trong môi trường production.

Việc ràng buộc token được kiểm soát duy nhất bởi 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. một quyền truy cập tồn tại cho token,
  2. nó chưa hết hạn (thời gian sống quyền = TimeOut của tài liệu),
  3. ID phiên ASP.NET yêu cầu khớp với ID đã mở tài liệu,
  4. nếu người mở đã xác thực, 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 PNG lỗi cho các yêu cầu trang/thumbnail, và dạng văn bản thường 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 xóa 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 các 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 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 thực ngắn hạn.

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