0

しばらくの間、単一のインスタンスで実行されていた Web ロールがあります。より高い負荷に対処する (そしてより良い SLA を取得する) ために、現在、ロールを移行して複数のインスタンスをサポートしています。

ロールはフォーム認証を使用し (カスタム メンバーシップ プロバイダーを使用)、インスタンス間である種の共有セッション状態を有効にする必要があることを理解したので、ユーザーがインスタンス 1 にサインインして.ASPXAUTHCookie を取得すると、インスタンス 2このクッキーについて知っています。

私たちはそれを行い、現在、ロールは 2 つのインスタンスで実行されており、すべてがうまく機能しています。サインインしたインスタンスとは別のインスタンスでリクエストが処理された場合でも、ユーザーがサインインしたままであることをテストしました。ユーザーがサインインしない場合、アクセスは拒否されます。

TableStorageSessionStateProviderまた、Azure Table Storage アカウントにテーブルが作成されているかどうかも確認しました。実際、、、および列を含むテーブルSessionsがあります。PartitionKeyRowKeyTimestamp

しかし、驚いたことに、Sessionsテーブルは常に空のままです。サインインしているユーザーの数に関係なく、テーブルにはデータがありません。

Sessionsテーブルを経由しない場合、これらのインスタンスはどのように通信できますか?

4

1 に答える 1

2

ここでは、 AuthenticationSession Stateという 2 つの異なるものを混同しています。

確かに、複数のインスタンスでセッション状態を使用するには、共有ストアが必要です (InProc は機能しません)。その場合TableStorageSessionStateProvider、すべてのインスタンスがここに保存されているセッション データにアクセスできるため、機能します。セッション状態は、ショッピング カートなど、ユーザーの現在のセッションに何かを保存するときに使用されます。そして、次のように呼び出しますSession["UserShoppingCart"] = shoppingCart;

しかし、あなたが質問で説明していることは、セッション状態とは何の関係もありません。それはすべてフォーム認証に関するものです。インスタンス 1 で認証すると、代わりにチケットが返されます (.ASPXAUTH Cookie に保存されます)。このチケットは暗号化および署名されており、ユーザー名、有効期限、カスタム ユーザー データなどの基本情報が含まれています。

複数のインスタンスがあるので、次のリクエストでインスタンス 2 に到達する可能性があります。インスタンスはどのように通信するのですか? まあ、そうではありません。要求が開始されるたびに、要求がページまたはコントローラーに到達する前に、FormsAuthenticationHttpModule が開始され、.ASPXAUTH Cookie を探します。署名をチェックして復号化し、HttpContext.Current.User に Cookie (チケット) からの情報を入力します。

インスタンス間の唯一のリンクは machineKey です (Cookie の暗号化/復号化/署名/検証に使用されます)。Windows Azure に複数のインスタンスを展開するときはいつでも、ファブリック コントローラーはすべてのインスタンスが同じ machineKey を取得するようにします。このようにして、インスタンス 2 は、インスタンス 1 によって暗号化および署名されたチケットを復号化および検証できるようになります。

于 2012-10-16T11:40:41.027 に答える