Συνεδρίες & Ασφάλεια
Συνεδρίες εγγράφων και έλεγχος πρόσβασης
Ένα διακριτικό Doconut είναι ισχυρό: όποιος το παρουσιάζει θα μπορούσε να ζητήσει κάθε σελίδα του εγγράφου αν δεν ήταν δεσμευμένο στη συνεδρία ανοίγματος. Αυτή η σελίδα εξηγεί τι περιέχει μια συνεδρία, πόσο διαρκεί και τους ελέγχους που ενεργοποιεί από προεπιλογή το UseDoconut().
Τι περιέχει μια συνεδρία εγγράφου
Κάθε επιτυχής OpenDocumentAsync δημιουργεί μία συνεδρία στο IMemoryCache:
- τον προβολέα φορτωμένης μορφής (την παρουσία μηχανής εγγράφου που κρατά το αναλυμένο έγγραφο),
- κατά-σελίδα κατάσταση — περιστροφή, αναστροφές και δεδομένα σχολιασμού που ο χρήστης εφαρμόζει στο widget,
- το προαιρετικό ευρετήριο αναζήτησης, που δημιουργείται αργά στην πρώτη αναζήτηση (ή φορτώνεται από ένα προ‑κατασκευασμένο αρχείο
.srhσε σενάρια web‑farm), - το υδατογράφημα της συνεδρίας από
DocOptions.Watermark.
Διάρκεια ζωής
Οι συνεδρίες λήγουν σε ένα συνεχές παράθυρο: 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 του 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 σελίδας. Μην το εγγράψετε δεύτερη φορά. Όταν ένα αίτημα μεταφέρει ένα διακριτικό, αναζητά το δικαίωμα πρόσβασης που καταγράφηκε όταν το έγγραφο άνοιξε και εξουσιοδοτεί μόνο εάν ισχύουν όλα τα παρακάτω:
- υπάρχει δικαίωμα για το διακριτικό,
- δεν έχει λήξει (διάρκεια δικαιώματος = το
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όταν ο χρήστης αφήνει το έγγραφο — ωφελούνται τόσο η μνήμη όσο και η ασφάλεια. - Ποτέ μην καταγράφετε ή μοιράζεστε διακριτικά· αντιμετωπίζετε τα ως βραχύβια διαπιστευτήρια.
Ήταν αυτή η σελίδα χρήσιμη;