1

Webセキュリティ(Microsoftのwebmatrixフレームワーク)と組み合わせたマルチテナンシーの概念に頭を悩ませています。私は次のようにマルチテナントのウェブサイトを構築しています:

  • mvc4
  • entityframework6
  • websecurity(webmatrixから)

認証する

WebSecurityメソッドを使用してユーザーが登録およびログインできるようにすることができます。ユーザーがログインしているかどうか、またはを介して認証されているかどうかを確認できますUser.Identy.IsAuthenticated

テナントを決定する

URL()でテナントを決定し[companyname].domain.comます。

新規顧客を登録する

新規のお客様は、アプリケーションの登録フォームからテナントを作成できます。ユーザーが登録する場合(URLに会社名が含まれていない場合)、会社の入力としてアカウントの入力を指定する必要があります。次に、companyname.domain.comに準拠する新しいエイリアスを作成します。つまり、簡単に言うと、テナントは常に1人以上のユーザー(1-N)に結合されます。

要件

テナント「abc」のユーザーがテナント「xyz」にログインできないことを保証する必要があります。(したがって、WebSecurityフレームワークは、すべてのテナントの共有データベースのように見えるので、あまり好きではありません(または私は間違っていますか?))。

私の質問

実世界のマルチテナントアプリケーションで「テナント」と「認証されたユーザー」のチェックを処理する方法について、いくつかの洞察を共有できますか?

私にとってのホットなトピック:

  • テナントと認証されたユーザーを1回検証しますか、それともすべてのコントローラーのすべてのアクションで検証しますか?
  • デフォルトのWebセキュリティクラスに依存するのは安全ですか、それとも独自のユーザーテーブルを設計する方が良いですか、それとも顧客のMembershipProvidersがより良い代替手段ですか?
  • 私はクッキーを使うべきですか、それともそれは非常に悪い選択です。

これらの質問についてすべて読むことができるドキュメントを共有していただければ、非常に助かります。私は、実際の設計(おそらくコード例でさえ)に飛び込むマルチテナンシーについてのより詳細なドキュメントを見たいと強く望んでいます。

私はすでにほとんどの「一般的なドキュメント」/「商業プレゼンテーション」を読みました:

必要に応じて、言い換えたり、コードを追加したり、助けを得るために必要なことは何でもします。

よろしくお願いします。

4

1 に答える 1

1

ここで取得できる各ソリューションは、リポジトリ パターンを使用する場合、IoC を使用する場合など、アプリの機能とデータの操作方法に依存します。ユーザー ID をリポジトリ クラスに渡し、アプリケーションごとにフィルタリングを行うことで、リポジトリをインスタンス化することを検討してください。データが必要な場合は、コントローラーでそれを行うことができます - このアプローチは非常に頻繁に使用されます (VS SampleProjects でさえ - 「SinglePage Application」のように、いくつかのオープン ソース プロジェクトをダウンロードして、そこでどのように行われるかを確認したい場合があります。

「本当に派手な」ものは何も必要とされず、大きな負荷がかかるとは思わないいくつかのプロジェクトで私が行うことは次のとおりです。-他のすべてのコントローラーが実装する必要があるBaseControllerをセットアップします-BaseControllerのonActionExecutingイベントで

public Employee CurrentEmployee { get; set; }

protected override void OnActionExecuting(ActionExecutingContext ctx)
{
    base.OnActionExecuting(ctx);
    string authenticatedUser = User.Identity.Name;
    CurrentEmployee = mortenDb.Employees.FirstOrDefault(e => e.Account.Login == authenticatedUser );
}

そのため、他のすべてのコントローラーでは、現在ログインしているユーザーに属する Employee オブジェクトを参照できます。Company オブジェクトでも同じことができます。したがって、私と同じように Employees にクエリを実行し、Company 参照を取得して、それを BaseController のパブリック プロパティに渡すと仮定します。これは最善の解決策ではないかもしれませんが、Company オブジェクト ナビゲーション プロパティ (たとえば、従業員、チケット、リクエストなど、モデルにあるものは何でも) を介してデータを引き出すことを忘れない限り、かなり安全です。

于 2013-01-14T13:44:37.333 に答える