セッションとセキュリティ

ドキュメント セッションとアクセス制御

Doconut トークンは開いているドキュメントを識別します。これを含むリクエストが処理されれば、取得した者はすべてのページを読むことができます。このページでは、ドキュメント セッションが保持するもの、その存続期間、そして DocImage.axd が誰がページを見ることができるかを決定する方法(単一サーバーおよび Web ファームで)を説明します。

ドキュメント セッションが保持するもの

各成功した OpenDocumentAsync は 1 つのセッションを作成し、メモリに保持します:

  • ロードされたフォーマット ビューア — 解析されたドキュメントを保持するエンジン インスタンス、
  • ページ単位の状態 — 回転、フリップ、そしてウィジェットでユーザーが適用する注釈データ、
  • 検索インデックス(オプション) — 最初の検索時に構築され(または事前構築された .srh ファイルからロードされ)、
  • セッション ウォーターマーク は DocOptions.Watermark から取得されます。

有効期間

セッションは スライディング ウィンドウ で期限切れになります:DocOptions.TimeOut 分(デフォルト 60)で、トークンを提示するすべてのリクエストによりリセットされます。セッションが終了すると(期限切れまたは CloseDocument(token) によって)、そのドキュメント エンジンは解放され、メモリは直ちに解放されます。

csharp
// ワンショットプレビュー用の短命セッション
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

期限切れトークンを含むリクエストはエラー画像 Document session not found. Please re-open document. を返します。ページは新しいトークンを取得するために再度ドキュメントを開く必要があります。単一サーバーでは、アプリケーション プールのリサイクルによりすべてのセッションも終了します。

ページはそれを開いたセッションのみに提供される

UnsafeMode = false(デフォルト)を使用すると、ドキュメントを開くことで そのリクエストの ASP.NET セッション へのアクセスが付与され、secure-{token} エントリがそのセッションに書き込まれます。DocImage.axd はセッション状態自体を必要とし、要求側のセッションがそのエントリを保持している場合にのみページを提供します。同じトークンを提示する別のブラウザーはエラー画像 You Are Not Authorized To View This Page. を受け取ります。

csharp
Doconut.DoconutHost.Initialize(options =>
{
    // false(デフォルト): DocImage.axd は、開いた ASP.NET セッションにのみページを提供します
    // ドキュメントです。ハンドラは自らセッション状態を要求します;サイトがそれをオフにしないことだけが必要です
    // Web.config でセッション状態をオフにします。
    options.UnsafeMode = false;
});

実務上の 3 つの結果:

  • オープン エンドポイントはセッション状態が必要です。 MVC コントローラと Web Forms ページはデフォルトでセッション状態を持ちます。カスタム IHttpHandler は System.Web.SessionState.IRequiresSessionState を実装しない限りセッション状態を持ちません。セッションなしでオープンすると付与すべきものがなくなるため、ビューアはすべてのページで「You Are Not Authorized To View This Page.」と表示します。
  • セッション状態は常に有効にしておく必要があります。 <sessionState mode="Off" /> in Web.config は付与とチェックの両方を無効にし、すべてのページが拒否されます。
  • ブラウザーはセッション クッキーを送信しなければなりません。 ウィジェットのリクエストは同一オリジンであるため、ASP.NET_SessionId が自動的に送信されます。クッキー jar を持たないクライアント(スクリプト、サーバー間呼び出し、クッキーを除去するクロスオリジン設定)は拒否されます。これが期待通りに機能していることを示します。

UnsafeMode = true はチェックをオフにします:トークンを含むすべてのリクエストが提供されます。これはドキュメントごとのオーバーライドがない、すべてのドキュメントに対するグローバルスイッチです。false のままにしてください。

取り消し

CloseDocument(token) はメモリ解放以上のことを行います:現在のリクエストのセッションから secure-{token} エントリを削除し、トークンを取り消すことで、閉じられたトークンは即座に拒否されます。

Web ファーム:署名付きチケット

ファームでは、次のリクエストがドキュメントを一度も見たことのないサーバーや別のワーカープロセス上のサーバーに届くことがあり、独自の ASP.NET セッションを持ちます。セッション付与は追従できません。分散モードでは、ブラウザーにバインドされた 署名付きチケット に置き換えられます:すべてのノードがドキュメント セッション用のストアと署名キーを共有し、DocImage.axd はそのチケットがトークン、ブラウザー、そしてユーザーがサインインしている場合はそのユーザーに対して有効なときにリクエストを受け入れます。

設定はすべてのノードで同一です:

csharp
// Global.asax.cs - Application_Start
Doconut.DoconutHost.Initialize(
    options => options.UnsafeMode = false,     // チケットチェックは、これが false のときだけ実行されます
    services => services.AddDoconutDistributed(d =>
    {
        d.Store             = CloudLocation.FileShare;
        d.FileShareRootPath = @"\\fileserver\doconut-shared";  // すべてのノードがアクセスできるフォルダー
        d.SigningKey        = farmKey;                          // 少なくとも 32 バイトで、すべてのノードで同じです
    }));

オープン エンドポイントは、開く前にチケットをブラウザーにバインドし、トークンと共にチケットを返します:

  • DocOptions.BrowserId = DoconutFarmBinding.EnsureBrowserId(System.Web.HttpContext.Current, securityOptions) を設定し、チケットに結び付けられた doconut-client クッキーを発行し、DocOptions.UserId = DoconutFarmBinding.ResolveUserId(System.Web.HttpContext.Current) を実行します;
  • OpenDocumentAsync 後に、トークンと一緒に viewer.AccessToken を返します;
  • ページ内で、両方をウィジェットに渡します:objViewer.View(token, access)。

サンプル パッケージの Doconut.MvcSample.WebFarm は完全な実行可能なファーム ノードであり、隣接する移行ガイドが各ステップを説明しています。

署名キーはソース管理から除外してください:それはチケットに署名し、共有ストア内のドキュメントを暗号化します。異なるキーを持つノードは、他のノードが発行したすべてのチケットを拒否します。

実際のブラウザー、またはクッキーを保持するスクリプトでファームをテストしてください。doconut-client クッキーを持たないクライアントは 401 で応答されません:ステータス 200 の「not authorized」エラー画像(約 2 KB)を受け取り、実際のページは数十〜数百キロバイトです。

本番チェックリスト

  • UnsafeMode = false を保持してください(デフォルト設定)。
  • セッション状態を持つリクエストからドキュメントを開き、セッション状態をオフにしないでください。
  • セッション クッキーが DocImage.axd に届くことを確認してください(同一オリジン、HTTPS、SameSite ポリシーが許可していること)。
  • ファームでは、すべてのノードが共有する 1 つの署名キーで分散モードを使用してください。
  • ユーザーがドキュメントを離れたときに CloseDocument を呼び出してください — メモリとセキュリティの両方が向上します。
  • トークンをログに記録したり共有したりしないでください;短命な認証情報として扱ってください。

このページは役に立ちましたか?