Συνεδρίες & Ασφάλεια

Συνεδρίες εγγράφων και έλεγχος πρόσβασης

Ένα διακριτικό Doconut είναι ισχυρό: όποιος το παρουσιάζει θα μπορούσε να ζητήσει κάθε σελίδα του εγγράφου αν δεν ήταν δεσμευμένο στη συνεδρία ανοίγματος. Αυτή η σελίδα εξηγεί τι περιέχει μια συνεδρία, πόσο διαρκεί και τους ελέγχους που ενεργοποιεί εξ ορισμού η UseDoconut().

Τι περιέχει μια συνεδρία εγγράφου

  • το φορτωμένο πρόγραμμα προβολής μορφής (η παρουσία μηχανής εγγράφου που κρατά το αναλυμένο έγγραφο),
  • κατά-σελίδα κατάσταση — περιστροφή, αναστροφές και δεδομένα σχολίων που ο χρήστης εφαρμόζει στο widget,
  • το προαιρετικό ευρετήριο αναζήτησης, που δημιουργείται αργά στην πρώτη αναζήτηση (ή φορτώνεται από ένα προ‑κατασκευασμένο αρχείο .srh σε σενάρια web‑farm),
  • το υδατογράφημα της συνεδρίας από 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} σε αυτή τη συνεδρία. Το middleware Doconut τότε αρνείται να σερβίρει σελίδες σε οποιαδήποτε άλλη συνεδρία προγράμματος περιήγησης:

  • Διαφορετικό πρόγραμμα περιήγησης/συνεδρία που παρουσιάζει κλεμμένο διακριτικό → εικόνα σφάλματος You Are Not Authorized To View This Page.
  • Το middleware συνεδρίας δεν είναι καταχωρημένο → HTTP 500 Session middleware not configured. Call UseSession() before UseDoconut().

Αυτός είναι ο λόγος που το Quick Start επιμένει στο AddSession() + app.UseSession() πριν από το κλάδο Doconut. Δύο πρακτικές συνέπειες:

  • Ο πελάτης πρέπει να στέλνει το cookie συνεδρίας ASP.NET με τα αιτήματα σελίδας. Ρυθμίσεις cross‑origin που αφαιρούν cookies (ή ένας πελάτης API χωρίς cookie jar) θα αποτύχουν τον έλεγχο — αυτό είναι η λειτουργία, όχι σφάλμα.
  • options.UnsafeMode = true απενεργοποιεί εντελώς τη σύνδεση. Υπάρχει για ελεγχόμενα σενάρια (π.χ. απόδοση server‑to‑server); αφήστε το false στην παραγωγή.

Η σύνδεση διακριτικού ελέγχεται αποκλειστικά από αυτόν τον παγκόσμιο διακόπτη UnsafeMode — είναι ενεργοποιημένο από προεπιλογή (UnsafeMode = false) και εφαρμόζεται σε κάθε συνεδρία. Δεν υπάρχει εξαίρεση ανά έγγραφο· ορίζοντας UnsafeMode = true απενεργοποιεί τη σύνδεση παγκοσμίως.

Παράδοση πρόσβασης και πιστοποιημένοι χρήστες

Όταν το UnsafeMode είναι false, το UseDoconut() εισάγει αυτόματα το DocumentAccessMiddleware πριν από το middleware σελίδας. Μην το καταχωρίσετε δεύτερη φορά. Όταν ένα αίτημα μεταφέρει ένα διακριτικό, αναζητά το δικαίωμα πρόσβασης που καταγράφηκε όταν το έγγραφο ανοίχθηκε και εξουσιοδοτεί μόνο εάν ισχύουν όλα τα παρακάτω:

  1. υπάρχει δικαίωμα για το διακριτικό,
  2. δεν έχει λήξει (διάρκεια δικαιώματος = το TimeOut του εγγράφου),
  3. το ID της αιτούσας συνεδρίας ASP.NET ταιριάζει με αυτό που άνοιξε το έγγραφο,
  4. αν ο ανοίγων ήταν πιστοποιημένος, το NameIdentifier claim του αιτούσας χρήστη ταιριάζει επίσης.

Οι αποτυχίες επιστρέφουν 403 — ως εικόνα σφάλματος PNG για αιτήματα σελίδας/μικρογραφίας, αλλιώς ως απλό κείμενο. Το μήνυμα και το κλειδί ερωτήματος διακριτικού προέρχονται από το DocumentSecurityOptions (TokenQueryKey, προεπιλογή "token"· UnauthorizedMessage, προεπιλογή "You Are Not Authorized To View This Page."). Διαμορφώστε αυτές τις επιλογές μέσω ASP.NET Core DI πριν δημιουργήσετε την εφαρμογή. Εάν η κατάσταση συνεδρίας δεν είναι διαθέσιμη, το middleware κλείνει με 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 σελίδας στη συνέχεια επαληθεύει τον δείκτη συνεδρίας secure-{token} πριν εξυπηρετήσει το έγγραφο. Με UnsafeMode = true, το UseDoconut() παραλείπει το middleware πρόσβασης και ο βασικός έλεγχος δείκτη είναι επίσης απενεργοποιημένος.

Ανάκληση

CloseDocument(token) δεν απελευθερώνει μόνο τη μνήμη — αφαιρεί επίσης τον δείκτη secure-{token} και ανακαλεί το δικαίωμα πρόσβασης, έτσι ένα κλεισμένο διακριτικό είναι άμεσα άχρηστο και στα δύο επίπεδα ασφαλείας.

Λίστα ελέγχου για παραγωγή

  • Διατηρήστε το UnsafeMode = false (η προεπιλογή) — αυτός ο παγκόσμιος διακόπτης είναι αυτός που δεσμεύει τα διακριτικά στις συνεδρίες.
  • Καταχωρίστε το AddSession() και καλέστε app.UseSession() πριν από το κλάδο middleware Doconut.
  • Βεβαιωθείτε ότι η πολιτική cookie συνεδρίας σας επιτρέπει στα αιτήματα του widget να μεταφέρουν το cookie (SameSite, HTTPS).
  • Χρησιμοποιήστε το CloseDocument όταν ο χρήστης εγκαταλείπει το έγγραφο — ωφελούνται η μνήμη και η ασφάλεια.
  • Ποτέ μην καταγράφετε ή μοιράζεστε διακριτικά· αντιμετωπίζετε τα ως βραχύβια διαπιστευτήρια.

Ήταν αυτή η σελίδα χρήσιμη;