セッションとセキュリティ
ドキュメントセッションとアクセス制御
Doconut トークンは強力です。セッションにバインドされていなければ、提示した者はドキュメントのすべてのページを要求できます。このページでは、セッションが保持するもの、存続期間、そして UseDoconut() がデフォルトで有効にするチェックについて説明します。
ドキュメントセッションが保持するもの
OpenDocumentAsync が成功すると、IMemoryCache に 1 つのセッションが作成されます。
- ロードされたフォーマットビューア(解析されたドキュメントを保持するドキュメントエンジンのインスタンス),
- ページごとの状態 — 回転、フリップ、ウィジェットでユーザーが適用する注釈データ,
- オプションの 検索インデックス、最初の検索時に遅延構築され(またはウェブファームシナリオで事前構築された
.srhファイルからロードされ), DocOptions.Watermarkからのセッション ウォーターマーク.
有効期間
セッションは スライディングウィンドウ で期限切れになります:DocOptions.TimeOut 分(デフォルト 60)で、トークンを提示するすべてのリクエストによりリセットされます。セッションが期限切れまたは CloseDocument(token) によって削除されると、削除コールバックがドキュメントエンジンを破棄し、関連メモリを即座に解放します。
// A short-lived session for a one-shot preview
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });期限切れトークンでのリクエストは、Document session not found. Please re-open document. というエラー画像が返されます — クライアントは新しいトークンを取得するためにドキュメントを再度開く必要があります。
組み込みトークンバインディング
UnsafeMode = false(デフォルト)では、OpenDocumentAsync は新しいトークンをそれを開いた HTTP リクエストの ASP.NET セッション にバインドし、セッションに secure-{token} マーカーを書き込みます。Doconut ミドルウェアは他のブラウザセッションへのページ提供を拒否します。
- 盗まれたトークンを提示する別のブラウザ/セッション → エラー画像
You Are Not Authorized To View This Page. - セッションミドルウェアが登録されていない → HTTP 500
Session middleware not configured. Call UseSession() before UseDoconut().
これがクイックスタートで Doconut ブランチの前に AddSession() と app.UseSession() を必須とする理由です。実務上の影響は 2 つあります。
- クライアントはページリクエストに ASP.NET セッションクッキー を送信する必要があります。クッキーを除去するクロスオリジン設定やクッキー保存がない API クライアントではチェックが失敗します — これはバグではなく機能です。
options.UnsafeMode = trueにするとバインディングが完全に無効化されます。これは制御されたシナリオ(例:サーバー間レンダリング)向けに存在します。運用環境ではfalseのままにしてください。
トークンバインディングはこのグローバルな UnsafeMode スイッチだけで制御されます — デフォルトで有効(UnsafeMode = false)で、すべてのセッションに適用されます。ドキュメント単位でのオプトアウトはなく、UnsafeMode = true に設定するとバインディングは全体で無効化されます。
アクセス権限と認証ユーザー
UnsafeMode が false の場合、UseDoconut() はページミドルウェアの前に DocumentAccessMiddleware を自動的に挿入します。二度登録しないでください。リクエストがトークンを持つと、ドキュメントが開かれたときに記録された アクセス権限 を参照し、以下すべてが満たされた場合にのみ認可します。
- トークンに対する権限が存在すること、
- 期限切れでないこと(権限の有効期間はドキュメントの
TimeOutと同じ)、 - 要求元の ASP.NET セッション ID がドキュメントを開いたときのものと一致すること、
- 開いたユーザーが認証済みの場合、要求元ユーザーの
NameIdentifierクレームも一致すること。
失敗した場合は 403 を返します — ページやサムネイルのリクエストでは PNG エラー画像として、その他はプレーンテキストとして返されます。メッセージとトークンのクエリキーは DocumentSecurityOptions(TokenQueryKey デフォルトは "token"、UnauthorizedMessage デフォルトは "You Are Not Authorized To View This Page.")から取得されます。アプリ構築前に ASP.NET Core の DI でこれらのオプションを設定してください。セッション状態が利用できない場合、ミドルウェアは 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.";
});コアのページミドルウェアは、ドキュメントを提供する前に secure-{token} セッションマーカーを検証します。UnsafeMode = true の場合、UseDoconut() はアクセスミドルウェアをスキップし、コアのマーカーチェックも無効化されます。
取り消し
CloseDocument(token) はメモリを解放するだけでなく、secure-{token} マーカーを削除し、アクセス権限を取り消すため、閉じられたトークンは即座に両方のセキュリティ層で無効になります。
本番環境向けチェックリスト
UnsafeMode = false(デフォルト)を維持する — このグローバルスイッチがトークンをセッションにバインドします。- Doconut ミドルウェアブランチの前に
AddSession()を登録し、app.UseSession()を呼び出す。 - セッションクッキーのポリシーがウィジェットのリクエストでクッキーを送信できるように設定する(
SameSite、HTTPS)。 - ユーザーがドキュメントを離れたときは
CloseDocumentを使用する — メモリとセキュリティの両方が向上します。 - トークンをログに記録したり共有したりしないでください。短命な認証情報として扱います。
このページは役に立ちましたか?