Sessioner & Säkerhet
Dokumentsessioner och åtkomstkontroll
En Doconut‑token är kraftfull: den som presenterar den kan begära varje sida i dokumentet om den inte var bunden till den öppnande sessionen. Denna sida förklarar vad en session innehåller, hur länge den lever och vilka kontroller UseDoconut() aktiverar som standard.
Vad en dokumentsession innehåller
Varje lyckad OpenDocumentAsync skapar en session i IMemoryCache:
- den laddade formatvisaren (dokumentmotor‑instansen som håller det parsade dokumentet),
- per-sidostatus — rotation, speglingar och annoteringsdata som användaren tillämpar i widgeten,
- det valfria sökindexet, byggt lat på den första sökningen (eller laddat från en förbyggd
.srh‑fil i webb‑farm‑scenarier), - sessionens vattenstämpel från
DocOptions.Watermark.
Livstid
Sessioner löper ut på ett glidande fönster: DocOptions.TimeOut minuter (standard 60), återställs av varje begäran som presenterar tokenen. När en session blir borttagen — genom utgång eller av CloseDocument(token) — frigör dess borttagnings‑callback dokumentmotorn och frigör det associerade minnet omedelbart.
// A short-lived session for a one-shot preview
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });En begäran med en utgången token får en felbild med texten Document session not found. Please re-open document. — klienten måste öppna om för att få en ny token.
Inbyggd tokenbindning
Med UnsafeMode = false (standard) binder OpenDocumentAsync den nya tokenen till ASP.NET‑sessionen för HTTP‑begäran som öppnade den, genom att skriva en secure-{token}‑markör i den sessionen. Doconut‑middleware vägrar sedan att leverera sidor till någon annan webbläsarsession:
- Olika webbläsare/session som presenterar en stulen token → felbild
You Are Not Authorized To View This Page. - Session‑middleware inte registrerad → HTTP 500
Session middleware not configured. Call UseSession() before UseDoconut().
Detta är varför Quick Start insisterar på AddSession() + app.UseSession() före Doconut‑grenen. Två praktiska konsekvenser:
- Klienten måste skicka ASP.NET sessionskakan med sidbegäran. Cross‑origin‑inställningar som tar bort kakor (eller en API‑klient utan cookie‑behållare) kommer att misslyckas med kontrollen — det är en funktion som fungerar, inte en bugg.
options.UnsafeMode = trueinaktiverar bindningen helt. Den finns för kontrollerade scenarier (t.ex. server‑till‑server‑rendering); låt den varafalsei produktion.
Tokenbindning styrs enbart av denna globala UnsafeMode‑växel — den är på som standard (UnsafeMode = false) och gäller för varje session. Det finns ingen per‑dokument‑avstängning; att sätta UnsafeMode = true inaktiverar bindningen globalt.
Åtkomsttillstånd och autentiserade användare
När UnsafeMode är false infogar UseDoconut() automatiskt DocumentAccessMiddleware före sid‑middleware. Registrera den inte en andra gång. När en begäran bär en token söker den upp åtkomsttillståndet som registrerades när dokumentet öppnades och godkänner endast om alla följande gäller:
- ett tillstånd finns för tokenen,
- det har inte gått ut (tillståndets livstid = dokumentets
TimeOut), - den begärande ASP.NET‑session‑ID:n matchar den som öppnade dokumentet,
- om öppnaren var autentiserad, matchar den begärande användarens
NameIdentifier‑claim också.
Fel returnerar 403 — som en PNG‑felbild för sid‑/miniatyr‑begäran, som vanlig text annars. Meddelandet och token‑frågeparametern kommer från DocumentSecurityOptions (TokenQueryKey, standard "token"; UnauthorizedMessage, standard "You Are Not Authorized To View This Page."). Konfigurera dessa alternativ via ASP.NET Core DI innan appen byggs. Om sessions‑tillstånd saknas misslyckas middleware med stängd status och 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.";
});Kärn‑sid‑middleware verifierar sedan secure-{token}‑sessionsmarkören innan den levererar dokumentet. Med UnsafeMode = true hoppar UseDoconut() över åtkomst‑middleware och den grundläggande markörkontrollen inaktiveras också.
Återkallelse
CloseDocument(token) frigör inte bara minnet — den tar även bort secure-{token}‑markören och återkallar åtkomsttillståndet, så en stängd token är omedelbart död på båda säkerhetslagren.
Checklista för produktion
- Behåll
UnsafeMode = false(standard) — denna globala växel binder token till sessioner. - Registrera
AddSession()och anropaapp.UseSession()före Doconut‑middleware‑grenen. - Se till att din sessionskaka‑policy låter widgetens begäran bära kakan (
SameSite, HTTPS). - Använd
CloseDocumentnär användaren lämnar dokumentet — både minne och säkerhet gynnas. - Logga eller dela aldrig token; behandla dem som kortlivade autentiseringsuppgifter.
Var den här sidan till hjälp?