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 OpenDocumentAsync erstellt eine Sitzung im IMemoryCache:
- der geladene Format-Viewer (die Dokument-Engine-Instanz, die das geparste Dokument hält),
- Seitenbezogener Zustand — Drehungen, Spiegelungen und Annotationsdaten, die der Benutzer im Widget anwendet,
- der optionale Suchindex, der beim ersten Suchen lazy aufgebaut wird (oder aus einer vorgefertigten
.srh‑Datei in Webfarm‑Szenarien geladen wird), - das Sitzungs-Wasserzeichen aus
DocOptions.Watermark.
Lebensdauer
Sitzungen verfallen nach einem gleitenden Fenster: DocOptions.TimeOut Minuten (Standard 60), zurückgesetzt bei jeder Anfrage, die das Token vorlegt. Wenn eine Sitzung verworfen wird — durch Ablauf oder durch CloseDocument(token) — entsorgt ihr Eviktions‑Callback die Dokument‑Engine 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 Anfrage 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 diese Sitzung geschrieben wird. Die Doconut‑Middleware verweigert dann das Bereitstellen von Seiten an jede andere Browsersitzung:
- Anderer Browser/Sitzung, der ein gestohlenes Token vorlegt → Fehlermotiv
You Are Not Authorized To View This Page. - Sitzungs‑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‑Speicher), 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); lassen Sie sie in der Produktionfalse.
Die Token‑Bindung wird ausschließlich durch diesen globalen UnsafeMode‑Schalter gesteuert — er ist standardmäßig aktiviert (UnsafeMode = false) und gilt für jede Sitzung. Es gibt keinen dokumentbezogenen Opt‑Out; das Setzen von UnsafeMode = true deaktiviert die Bindung global.
Zugriffsrechte 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 das beim Öffnen des Dokuments aufgezeichnete Zugriffsrecht nach und autorisiert nur, wenn alle folgenden Bedingungen erfüllt sind:
- Ein Zugriffsrecht existiert für das Token,
- es ist nicht abgelaufen (Lebensdauer des Rechts = das
TimeOutdes Dokuments), - die anfragende ASP.NET‑Sitzungs‑ID stimmt mit derjenigen überein, die das Dokument geöffnet hat,
- wenn der Öffner authentifiziert war, stimmt der
NameIdentifier‑Anspruch des anfragenden Benutzers ebenfalls.
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 dann 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 auch den secure-{token}‑Marker und widerruft das Zugriffsrecht, 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
AddSession()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?