シナリオ
WindowsAzureでホストされるMVCアプリケーションを開発します。開発中、ローカルデータベースとローカルユーザーメンバーシップサービスに対してテストします。本番環境では、アプリケーションはSQLAzureデータベースとクラウドでホストされるユーザーメンバーシップサービスを利用します。
ローカルマシンにのみ存在するユーザーアカウントを使用して、サイトのローカルバージョンにログインすることがあります。ログアウトするのを忘れたが、マシンをテストモードから切り替えると、問題が発生し始めます。
問題
ブラウザーの要求がAzureエミュレーターによってローカルで処理されるようにhosts
、アプリケーションのURLを指すようにファイルを設定しました。127.255.0.0
これは、テストアプリケーションと本番アプリケーションが同じホスト名を使用していることも意味します。一方のCookieは、もう一方の有効なCookieと見なされます。
ローカルシステムにログインするとASPXAUTH
、ドメインのCookieが作成され、ローカルシステムのユーザーの資格情報が含まれます。ログアウトしてhosts
ファイルを通常の状態に戻すのを忘れた場合(ブラウザーの要求はライブアプリケーションに送信されます)、ASPXAUTH
サーバーに同じCookieが送信されます。
このユーザーはサーバー上に存在せず、ローカルにのみ存在するため、などのリクエストMembership.GetUser().Email
はオブジェクトnull例外を返します。
やりたいこと
理想的には、リクエストの早い段階でコードを挿入して、ユーザーが存在することを確認できます。何かのようなもの:
MembershipUser user = Membership.GetUser();
if(user == null) {
FormsAuthentication.SignOut();
}
ASPXAUTH
これにより、無効なユーザーのCookieが自動的に削除されます。しかし、どこに置くのですか?私は自分のコントローラーを見始めました-それらはすべてBaseController
クラスから継承しますが、このコードをベースコントローラーのコンストラクターに入れることさえ十分に早い段階ではありません。も調べましたGlobal.asax
が、このアクションをどのイベントに結び付けるのが最適かわかりません。
また、これが正しい方法かどうかさえわかりません。そうでない場合、現在のようにメンバーシップクラスに依存する前に、認証Cookieが有効なユーザー用であることを確認するための最良の方法は何ですか?