セッションとセキュリティ
ドキュメントセッションとアクセス制御
Doconut のトークンは強力です。これを提示した者は、オープンセッションにバインドされていなければ、ドキュメントのすべてのページを要求できてしまいます。このページでは、セッションが保持するもの、存続期間、そしてデフォルトで UseDoconut() が有効にするチェックについて説明します。
ドキュメントセッションが保持するもの
各成功した OpenDocumentAsync は、IMemoryCache に 1 つのセッションを作成します:
- ロードされたフォーマットビューア(解析されたドキュメントを保持するドキュメントエンジンインスタンス),
- ページ単位の状態 — 回転、フリップ、ウィジェットでユーザーが適用する注釈データ,
- 任意の search index、最初の検索時に遅延構築され(またはウェブファームシナリオで事前構築された
.srhファイルからロードされ), - セッション 透かし は
DocOptions.Watermarkから取得されます。
有効期間
セッションは スライディングウィンドウ で期限切れになります:DocOptions.TimeOut 分(デフォルト 60)、トークンを提示するすべてのリクエストでリセットされます。セッションが除去されるとき—期限切れまたは CloseDocument(token) によって—除去コールバックがドキュメントエンジンを破棄し、関連メモリを即座に解放します。
// 一回限りのプレビュー用の短命セッション
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().
これが、Quick Start が 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を保持してください(デフォルト) — このグローバルスイッチがトークンをセッションにバインドします。AddDistributedMemoryCache()を登録してください(MVC と Razor Pages アプリは既に持っています)およびAddSession()、そして Doconut ミドルウェアブランチの前にapp.UseSession()を呼び出します。- ウィジェットのリクエストがクッキーを送信できるよう、セッション クッキー ポリシー を設定してください(
SameSite、HTTPS)。 - ユーザーがドキュメントを離れるときは
CloseDocumentを使用してください — メモリとセキュリティの両方に利点があります。 - トークンを決してログに記録したり共有したりしないでください;短命な認証情報として扱ってください。
このページは役に立ちましたか?