Συνεδρίες & Ασφάλεια
Συνεδρίες εγγράφων και έλεγχος πρόσβασης
Ένα διακριτικό Doconut είναι ισχυρό: όποιος το παρουσιάζει θα μπορούσε να ζητήσει κάθε σελίδα του εγγράφου αν δεν ήταν δεσμευμένο στη συνεδρία ανοίγματος. Αυτή η σελίδα εξηγεί τι περιέχει μια συνεδρία, πόσο διαρκεί και τους ελέγχους που ενεργοποιεί εξ ορισμού η UseDoconut().
Τι περιέχει μια συνεδρία εγγράφου
Κάθε επιτυχής OpenDocumentAsync δημιουργεί μια συνεδρία στο IMemoryCache:
- το loaded format viewer (η παρουσία του μηχανήματος εγγράφου που κρατά το αναλυμένο έγγραφο),
- το per-page state — περιστροφή, αναστροφές και δεδομένα σχολίων που ο χρήστης εφαρμόζει στο widget,
- το προαιρετικό search index, που δημιουργείται αργά στην πρώτη αναζήτηση (ή φορτώνεται από ένα προ‑κατασκευασμένο αρχείο
.srhσε σενάρια web‑farm), - το watermark της συνεδρίας από το
DocOptions.Watermark.
Διάρκεια ζωής
Οι συνεδρίες λήγουν σε ένα sliding window: DocOptions.TimeOut λεπτά (προεπιλογή 60), που επαναρυθμίζεται από κάθε αίτημα που παρουσιάζει το διακριτικό. Όταν μια συνεδρία αποβάλλεται — λόγω λήξης ή από το CloseDocument(token) — η callback αποβολής της διαγράφει το μηχανισμό εγγράφου και ελευθερώνει τη σχετική μνήμη αμέσως.
// 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. Δύο πρακτικές συνέπειες:
- Ο πελάτης πρέπει να στέλνει το session 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 σελίδας. Μην το καταχωρίσετε δεύτερη φορά. Όταν ένα αίτημα μεταφέρει ένα διακριτικό, αναζητά το access grant που καταγράφηκε όταν το έγγραφο άνοιξε και εξουσιοδοτεί μόνο εάν ισχύουν όλα τα παρακάτω:
- υπάρχει ένα grant για το διακριτικό,
- δεν έχει λήξει (διάρκεια grant = το
TimeOutτου εγγράφου), - το ID της ζητούσας συνεδρίας ASP.NET ταιριάζει με αυτό που άνοιξε το έγγραφο,
- αν ο ανοίγων ήταν πιστοποιημένος, η αξίωση
NameIdentifierτου ζητούσας χρήστη ταιριάζει επίσης.
Οι αποτυχίες επιστρέφουν 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.
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. - Βεβαιωθείτε ότι η πολιτική του session cookie σας επιτρέπει στα αιτήματα του widget να μεταφέρουν το cookie (
SameSite, HTTPS). - Χρησιμοποιήστε το
CloseDocumentόταν ο χρήστης εγκαταλείπει το έγγραφο — ωφελούνται η μνήμη και η ασφάλεια. - Ποτέ μην καταγράφετε ή μοιράζεστε διακριτικά· αντιμετωπίζετε τα ως βραχυπρόθεσμα διαπιστευτήρια.
Ήταν αυτή η σελίδα χρήσιμη;