セッションとセキュリティ
ドキュメント セッションとアクセス制御
Doconut トークンは開いているドキュメントを識別します。これを含むリクエストが処理されれば、取得した者はすべてのページを読むことができます。このページでは、ドキュメント セッションが保持するもの、その存続期間、そして DocImage.axd が誰がページを見ることができるかを決定する方法(単一サーバーおよび Web ファームで)を説明します。
ドキュメント セッションが保持するもの
各成功した OpenDocumentAsync は 1 つのセッションを作成し、メモリに保持します:
- ロードされたフォーマット ビューア — 解析されたドキュメントを保持するエンジン インスタンス、
- ページ単位の状態 — 回転、フリップ、そしてウィジェットでユーザーが適用する注釈データ、
- 検索インデックス(オプション) — 最初の検索時に構築され(または事前構築された
.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(デフォルト)を使用すると、ドキュメントを開くことで そのリクエストの ASP.NET セッション へのアクセスが付与され、secure-{token} エントリがそのセッションに書き込まれます。DocImage.axd はセッション状態自体を必要とし、要求側のセッションがそのエントリを保持している場合にのみページを提供します。同じトークンを提示する別のブラウザーはエラー画像 You Are Not Authorized To View This Page. を受け取ります。
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" />inWeb.configは付与とチェックの両方を無効にし、すべてのページが拒否されます。 - ブラウザーはセッション クッキーを送信しなければなりません。 ウィジェットのリクエストは同一オリジンであるため、
ASP.NET_SessionIdが自動的に送信されます。クッキー jar を持たないクライアント(スクリプト、サーバー間呼び出し、クッキーを除去するクロスオリジン設定)は拒否されます。これが期待通りに機能していることを示します。
UnsafeMode = true はチェックをオフにします:トークンを含むすべてのリクエストが提供されます。これはドキュメントごとのオーバーライドがない、すべてのドキュメントに対するグローバルスイッチです。false のままにしてください。
取り消し
CloseDocument(token) はメモリ解放以上のことを行います:現在のリクエストのセッションから secure-{token} エントリを削除し、トークンを取り消すことで、閉じられたトークンは即座に拒否されます。
Web ファーム:署名付きチケット
ファームでは、次のリクエストがドキュメントを一度も見たことのないサーバーや別のワーカープロセス上のサーバーに届くことがあり、独自の ASP.NET セッションを持ちます。セッション付与は追従できません。分散モードでは、ブラウザーにバインドされた 署名付きチケット に置き換えられます:すべてのノードがドキュメント セッション用のストアと署名キーを共有し、DocImage.axd はそのチケットがトークン、ブラウザー、そしてユーザーがサインインしている場合はそのユーザーに対して有効なときにリクエストを受け入れます。
設定はすべてのノードで同一です:
// 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を呼び出してください — メモリとセキュリティの両方が向上します。 - トークンをログに記録したり共有したりしないでください;短命な認証情報として扱ってください。
このページは役に立ちましたか?