- PR -

ロードバランサを使用して複数サーバでフォーム認証を共有するには?

1
投稿者投稿内容
さとくんパパ♪
常連さん
会議室デビュー日: 2004/05/07
投稿数: 29
投稿日時: 2008-10-07 11:38
こんにちは、さとくんパパこと古谷です。お世話になっています。

ASP.NETを使用した比較的規模の大きなWEBサイトにおいて、ロードバランサを
使用した負荷分散をする際の注意点について質問させていただきます。

--------------------------------
【1.ずばり知りたい事】
--------------------------------
異なるサーバ間で負荷分散を行う場合、フォーム認証情報を共有する際の注意
事項を知りたい。現在、赤間さんを始めとする様々な書籍に書いてある通り
アプリやWeb.Configを設定しているが、上手く動作しない。

--------------------------------
【2−1.簡単なモデル(アプリ)】
--------------------------------
WEBアプリケーションA/Bがあります。(以降『app_A』, 『app_B』とします。)

この両者はWeb.Configでフォーム認証用に専用ログインプログラム『app_L』を
使用するように指定してあります。

つまり3つのアプリともWeb.Configの主要部分は、以下のように共有してあります。
勿論暗号化キーは完全一致です。

<system.web>
・・・・
<authentication mode="Forms">
<forms path="/"
name="(仮想フォルダ名)"
loginUrl="/app_L/login.aspx"
protection="All"
timeout="30">
</forms>
</authentication>
・・・・
<authorization>
<deny users="?" />
</authorization>
・・・・
<machineKey
validationKey= "(明示的に書いてあります)"
decryptionKey= "(明示的に書いてあります)"
validation="SHA1"/>
・・・・
</system.web>

ここでapp_L/login.aspxでログインに成功すると、自動的にapp_Aに遷移します。
app_A, app_Bは互いにリダイレクとするI/Fを画面上に持っています。

また、app_A/ app_B/ app_Lは動的にサーバ名をHtmlのてっぺんに表示できるよう
になっており、以下に説明するLBでどのサーバ上から返されたものかは判別でき
るようになています。

--------------------------------
【2−2.簡単なモデル(ハード)】
--------------------------------
上記app_A/ app_B/ app_Lを冗長化構成した2つのサーバ1/2上にインストールし
Webサイトやプログラム設定を完全に一致させた状態で行います。当然
machine.configも完全に一致させます。

サーバOS=Windows 2003 Server + IIS6.0
アプリはASP.NET 1.1です。

サーバ1/2は自動的に空いている方に振り分けられるようLBで設定されています。
ただしテスト時にはマニュアルで一方の通信を遮断する事が出来ます。

--------------------------------
【3.テスト内容】
--------------------------------
@上述の環境において、まずLBによりサーバ1のみ通信可能な状態にしておき、
 クライアントからapp_Lのログイン画面を呼びます。

Aここでログインに成功するとサーバ1上のapp_Aに遷移します。

Bこの状態でLBによりサーバ1の通信を遮断してサーバ2の通信を開通させます。

Cさあ、ここでクライアントのapp_A画面より、app_Bへのリダイレクとボタンを
 クリックするとどうなるでしょう?当然『認証情報が共有されているから』ポン
 とapp_Bが表示されるはずなのですが・・・

--------------------------------
【4.テスト結果】
--------------------------------
何故かここでサーバ2上のログイン画面が表示されてしまうのです!

Web.Configの設定は各アプリケーション毎に置いたり、共通の仮想ディレクトリの
ルートに置いたり、暗号化キーはmachine.keyに入れなおしたりと、あらゆる事を
試みたのですが、現象は変わりません。

何か凄く基本的なことを勘違いしているのか・・・それとも、そもそも出来ない事を
やろうとしているのか、行き詰ってしまいました。
何か解決になるヒントのようなもので結構です。どうか解決策をご教授くださいませ。

--------------------------------
【5.これまでの経緯】
--------------------------------
ちなみに今までは、同一サーバ内に複数アプリを置いたサーバを複数立てておき、
クライアントからの要求があった場合、LBの設定で通信を開始したサーバに
セッションが切れるまで(=ブラウザを閉じるまで)繋ぐようにしておりました。

これで特に問題なくWEBサイトも回っていたのですが、新規に大きなWEBアプリを
立ち上げる事となり、これだけ別途WEBサーバにおく必要が生じたため、上述のよう
なアプリ構成にする必要が生じた次第であります。


以上、長文にて誠に申し訳ございませんが、何卒よろしくお願いいたします。


[ メッセージ編集済み 編集者: さとくんパパ♪ 編集日時 2008-10-07 13:11 ]
さとくんパパ♪
常連さん
会議室デビュー日: 2004/05/07
投稿数: 29
投稿日時: 2008-10-10 12:11
こんにちは、さとくんパパこと古谷です。
自己レスです。

その後自分でいろいろやってみましたが、やはりダメです。
ちょっと質問文が長すぎたのでもう少し要約しますね。

--------------------------------
状況の要約
--------------------------------

www.test.comというドメインがあり、この下に2つのWEBアプリがあります。

アプリA= www.test.com/testA/myhome.aspx
アプリB= www.test.com/testB/myhome.aspx

この2つは、以下のWEBアプリをフォーム認証で使用します。
アプリL= www.test.com/login/login.aspx
また、ここでログインすると自動的にアプリAに遷移します。

--------------------------------
アプリA/B/Lは冗長構成になっているサーバ01/02に完全に同一構成で配置
され、ロードバランサにより負荷分散されています。

--------------------------------
実現したい事
--------------------------------
クライアントがサーバ01に繋がっている状態でログインに成功し、アプリAに
遷移した後、サーバ02のアプリBに遷移する際に、再度ログイン要求がされ
ないようにしたい。

※)サーバ01/02のmachineKeyを完全一致させれば、クライアントからは
 『www.test.com』ドメインへのページ要求であるため、認証クッキーは
 サーバ01/02とも同じものとして認証されるハズ。。。
 と理解しております。

--------------------------------
で、何度やっても上手く行かないという事は・・・

@ やはり何かの設定がおかしい

A 『実現したい事』は実は出来ない!

のいずれかだと思います。私は@だと思って色々やってみているのですが
段々自信がなくなってきました。これって、やはり出来ない事なのでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)