セッションとセキュリティ
ドキュメントセッションとアクセス制御
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() を必ず実行することを推奨しています。実際的な結果は次の二つです:
- クライアントはページリクエスト時に 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(デフォルト)を維持する — このグローバルスイッチがトークンをセッションにバインドします。AddSession()を登録し、Doconut ミドルウェアブランチの前にapp.UseSession()を呼び出す。- セッションクッキーのポリシーがウィジェットのリクエストでクッキーを送信できるように設定する(
SameSite、HTTPS)。 - ユーザーがドキュメントを離れたときに
CloseDocumentを使用する — メモリとセキュリティの両方が向上します。 - トークンをログに記録したり共有したりしないでください;短命な認証情報として扱う。
このページは役に立ちましたか?