Sitzungen & Sicherheit
Dokumentensitzungen und Zugriffskontrolle
Ein Doconut‑Token ist mächtig: Wer ihn vorlegt, könnte jede Seite des Dokuments anfordern, wenn er nicht an die eröffnende Sitzung gebunden wäre. Diese Seite erklärt, was eine Sitzung enthält, wie lange sie lebt und welche Prüfungen UseDoconut() standardmäßig aktiviert.
Was eine Dokumentensitzung enthält
Jeder erfolgreiche Aufruf von OpenDocumentAsync erzeugt eine Sitzung im IMemoryCache:
- den geladenen Format‑Viewer (die Dokument‑Engine‑Instanz, die das geparste Dokument hält),
- Seitenbezogenen Zustand — Drehungen, Spiegelungen und Annotationsdaten, die der Benutzer im Widget anwendet,
- den optionalen Suchindex, der beim ersten Suchen träge erstellt wird (oder aus einer vorgefertigten
.srh‑Datei in Web‑Farm‑Szenarien geladen wird), - das Sitzungs‑Wasserzeichen aus
DocOptions.Watermark.
Lebensdauer
Sitzungen verfallen in einem gleitenden Fenster: DocOptions.TimeOut Minuten (Standard 60), zurückgesetzt bei jeder Anforderung, die das Token vorlegt. Wenn eine Sitzung verworfen wird – durch Ablauf oder durch CloseDocument(token) – ruft ihr Eviktions‑Callback die Dokument‑Engine ab und gibt den zugehörigen Speicher sofort frei.
// Eine kurzlebige Sitzung für eine einmalige Vorschau
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });Eine Anforderung mit einem abgelaufenen Token erhält ein Fehlermotiv mit dem Text Document session not found. Please re-open document. – der Client muss das Dokument erneut öffnen, um ein frisches Token zu erhalten.
Eingebaute Token-Bindung
Mit UnsafeMode = false (Standard) bindet OpenDocumentAsync das neue Token an die ASP.NET‑Sitzung der HTTP‑Anfrage, die es geöffnet hat, indem ein secure-{token}‑Marker in dieser Sitzung gespeichert wird. Die Doconut‑Middleware verweigert dann das Bereitstellen von Seiten für jede andere Browsersitzung:
- Ein anderer Browser/eine andere Sitzung, die ein gestohlenes Token vorlegt → Fehlermotiv
You Are Not Authorized To View This Page. - Session‑Middleware nicht registriert → HTTP 500
Session middleware not configured. Call UseSession() before UseDoconut().
Deshalb besteht das Quick‑Start‑Handbuch darauf, AddSession() + app.UseSession() vor dem Doconut‑Zweig aufzurufen. Zwei praktische Konsequenzen:
- Der Client muss das ASP.NET‑Sitzungs‑Cookie mit Seitenanfragen senden. Cross‑Origin‑Setups, die Cookies entfernen (oder ein API‑Client ohne Cookie‑Jar), lassen die Prüfung fehlschlagen – das ist das gewünschte Verhalten, kein Fehler.
options.UnsafeMode = truedeaktiviert die Bindung vollständig. Sie existiert für kontrollierte Szenarien (z. B. Server‑zu‑Server‑Rendering); in der Produktion sollte siefalsebleiben.
Die Token‑Bindung wird ausschließlich durch diesen globalen UnsafeMode‑Schalter gesteuert – er ist standardmäßig aktiv (UnsafeMode = false) und gilt für jede Sitzung. Es gibt keinen dokumentbezogenen Opt‑Out; das Setzen von UnsafeMode = true deaktiviert die Bindung global.
Zugriffsberechtigungen und authentifizierte Benutzer
Wenn UnsafeMode false ist, fügt UseDoconut() automatisch DocumentAccessMiddleware vor die Seiten‑Middleware ein. Registrieren Sie sie nicht ein zweites Mal. Wenn eine Anfrage ein Token enthält, sucht sie die beim Öffnen des Dokuments aufgezeichnete Zugriffsberechtigung und autorisiert nur, wenn alle folgenden Bedingungen erfüllt sind:
- Es existiert eine Berechtigung für das Token,
- Sie ist nicht abgelaufen (Berechtigungsdauer = das
TimeOutdes Dokuments), - Die anfordernde ASP.NET‑Sitzungs‑ID stimmt mit derjenigen überein, die das Dokument geöffnet hat,
- Wenn der Eröffner authentifiziert war, stimmt auch der
NameIdentifier‑Anspruch des anfordernden Benutzers überein.
Fehler führen zu 403 – als PNG‑Fehlermotiv für Seiten‑/Thumbnail‑Anfragen, sonst als Klartext. Die Meldung und der Token‑Abfrage‑Schlüssel stammen aus DocumentSecurityOptions (TokenQueryKey, Standard "token"; UnauthorizedMessage, Standard "You Are Not Authorized To View This Page."). Konfigurieren Sie diese Optionen über ASP.NET‑Core‑DI, bevor die Anwendung gebaut wird. Ist der Sitzungszustand nicht verfügbar, schlägt die Middleware mit HTTP 500 fehl: 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.";
});Die Kern‑Seiten‑Middleware prüft anschließend den secure-{token}‑Marker, bevor sie das Dokument bereitstellt. Bei UnsafeMode = true überspringt UseDoconut() die Zugriffs‑Middleware und die Kern‑Marker‑Prüfung wird ebenfalls deaktiviert.
Widerruf
CloseDocument(token) gibt nicht nur Speicher frei – es entfernt außerdem den secure-{token}‑Marker und widerruft die Zugriffsberechtigung, sodass ein geschlossenes Token sofort auf beiden Sicherheitsebenen ungültig ist.
Checkliste für die Produktion
- Behalten Sie
UnsafeMode = false(Standard) bei – dieser globale Schalter bindet Tokens an Sitzungen. - Registrieren Sie
AddDistributedMemoryCache()(MVC‑ und Razor‑Pages‑Apps haben es bereits) undAddSession()und rufen Sieapp.UseSession()vor dem Doconut‑Middleware‑Zweig auf. - Stellen Sie sicher, dass Ihre Sitzungs‑Cookie‑Richtlinie die Anfragen des Widgets das Cookie mitführen lässt (
SameSite, HTTPS). - Verwenden Sie
CloseDocument, wenn der Benutzer das Dokument verlässt – Speicher und Sicherheit profitieren beide. - Loggen oder teilen Sie Tokens niemals; behandeln Sie sie als kurzlebige Anmeldeinformationen.
War diese Seite hilfreich?