2

バックグラウンド

テナントごとに複数のデータベースを使用するマルチテナント アプリケーションがあります。私は CodeFirstMembership を使用しているので、SimpleMembership の実装を完全に制御できます。私の User/Role エンティティは両方とも、アプリケーションの残りの部分と同じ DbContext にあります。

問題

マルチテナンスを容易にするために、サブドメインを取得し、アカウントを持つテナントに対してチェックし、その特定の接続文字列。使用されているサブドメインを返す .GetSubdomain() と呼ばれる RouteData の拡張メソッドがあるので、それがあなたの答えに役立つ場合は、実際にチェックを行って接続文字列を取得できます。

[Authorize] メソッドが正しく機能するために正しいデータベースを指すために、メンバーシップ プロバイダーがサブドメイン チェック情報にアクセスできるようにする必要があります。

私が試したこと

  • InitializeSimpleMembershipAttribute でのメンバーシップ プロバイダーの初期化
    • 動的パラメーターを属性 (RouteData.GetSubdomain() など) に渡すことができないため、これは機能しませんでした。
  • コンストラクターでメンバーシップを初期化します。
    • コンストラクターで RouteData メソッドを呼び出してアプリをビルド/実行することはできますが、RouteData はコントローラーのコンストラクターの時点で設定されていないため、このメソッドも機能しませんでした。
  • 私はこれを試しませんでしたが、承認が既に実行されているため、各コントローラーメソッドの開始時にチェックを追加しても機能しない可能性があります。

だから... 私が試したことから、RouteDataが設定されている場所と実際のAuthorizationの間のポイントにフックする必要があるようです。これを効果的に行うポイントはありますか?

ありがとう!

4

1 に答える 1

1

おお。完全な見落としでActionExecutingContext、InitializeSimpleMembership 属性に渡されていた を確認できませんでした。渡されるコンテキストには、RouteData と、メンバーシップを適切に初期化するために必要なサブドメイン情報が実際に含まれています。

于 2013-03-03T22:58:11.570 に答える