Συνεδρίες & Ασφάλεια
Συνεδρίες εγγράφων και έλεγχος πρόσβασης
Ένα διακριτικό Doconut είναι ισχυρό: όποιος το παρουσιάσει θα μπορούσε να ζητήσει κάθε σελίδα του εγγράφου αν δεν ήταν δεσμευμένο στη συνεδρία ανοίγματος. Αυτή η σελίδα εξηγεί τι περιέχει μια συνεδρία, πόσο διαρκεί και τους ελέγχους που ενεργοποιεί εξ ορισμού το UseDoconut().
Τι περιέχει μια συνεδρία εγγράφου
Κάθε επιτυχής OpenDocumentAsync δημιουργεί μία συνεδρία στο IMemoryCache:
- τον φορτωμένο προβολέα μορφής (την παρουσία της μηχανής εγγράφου που κρατά το αναλυμένο έγγραφο),
- κατά‑σελίδα κατάσταση — περιστροφή, αναστροφές και δεδομένα σχολιασμού που ο χρήστης εφαρμόζει στο widget,
- το προαιρετικό ευρετήριο αναζήτησης, που δημιουργείται αργά στην πρώτη αναζήτηση (ή φορτώνεται από ένα προ‑κατασκευασμένο αρχείο
.srhσε σενάρια web‑farm), - το υδατογράφημα της συνεδρίας από το
DocOptions.Watermark.
Διάρκεια ζωής
Οι συνεδρίες λήγουν σε ένα sliding window: DocOptions.TimeOut λεπτά (προεπιλογή 60), επαναφέρονται από κάθε αίτημα που παρουσιάζει το διακριτικό. Όταν μια συνεδρία αποβάλλεται — λόγω λήξης ή λόγω CloseDocument(token) — η κλήση επιστροφής αποβολής απελευθερώνει τη μηχανή εγγράφου και ελευθερώνει τη σχετική μνήμη αμέσως.
// Μια σύντομη συνεδρία για μια εφάπαξ προεπισκόπηση
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });Ένα αίτημα με ληγμένο διακριτικό λαμβάνει μια εικόνα σφάλματος που διαβάζει Document session not found. Please re-open document. — ο πελάτης πρέπει να ανοίξει ξανά για να αποκτήσει ένα νέο διακριτικό.
Ενσωματωμένη δέσμευση διακριτικού
Με το UnsafeMode = false (η προεπιλογή), το OpenDocumentAsync δεσμεύει το νέο διακριτικό στη ASP.NET session του 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) και εφαρμόζεται σε κάθε συνεδρία. Δεν υπάρχει επιλογή opt‑out ανά έγγραφο· ο ορισμός του UnsafeMode = true απενεργοποιεί τη δέσμευση παγκοσμίως.
Δικαιώματα πρόσβασης και πιστοποιημένοι χρήστες
Όταν το UnsafeMode είναι false, το UseDoconut() εισάγει το DocumentAccessMiddleware αυτόματα πριν από το middleware σελίδας. Μην το καταχωρίσετε δεύτερη φορά. Όταν ένα αίτημα μεταφέρει ένα διακριτικό, αναζητά το access 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(η προεπιλογή) — αυτός ο παγκόσμιος διακόπτης είναι αυτός που δεσμεύει τα διακριτικά στις συνεδρίες. - Καταχωρίστε το
AddDistributedMemoryCache()(οι εφαρμογές MVC και Razor Pages το έχουν ήδη) και τοAddSession(), και καλέστε τοapp.UseSession()πριν από το κλαδί middleware Doconut. - Βεβαιωθείτε ότι η πολιτική cookie της συνεδρίας σας επιτρέπει στα αιτήματα του widget να μεταφέρουν το cookie (
SameSite, HTTPS). - Χρησιμοποιήστε το
CloseDocumentόταν ο χρήστης αφήνει το έγγραφο — η μνήμη και η ασφάλεια ωφελούνται. - Ποτέ μην καταγράφετε ή μοιράζεστε διακριτικά· αντιμετωπίζετε τα ως βραχυπρόθεσμα διαπιστευτήρια.
Ήταν αυτή η σελίδα χρήσιμη;