1

私は、テナントごとに個別の DB を使用する MVC4 マルチテナント サイトの作成に取り組んでおり、テナントごとにメンバーシップ ピースを機能させようとしていますが、うまくいきません。

何らかの理由で、connectionStringField は、何をしても常に null です。なぜこれが起こるのでしょうか?

public class CodeFirstMembershipProvider : MembershipProvider
    {    
      public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)  
      { 
          base.Initialize(name, config);  

          // hard coded for testing  
          string connectionString = @"server=localhost;database=masterdb;uid=master;pwd=password";

          // Set private property of Membership provider.  
          FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);  
          if(connectionStringField != null)
            connectionStringField.SetValue(this, connectionString);  
      }
}
4

1 に答える 1

6

これを機能させることはできません。リフレクションを希望どおりに機能させる方法を理解できたとしても。それは不安定性と予期しない結果につながります。

その理由は、メンバーシッププロバイダーが、すべての同時ユーザーで使用されるグローバルな静的な単一インスタンスであるためです。つまり、1人のユーザーの接続文字列を変更すると、すべてのユーザーの接続文字列が変更されます。さらに悪いことに、あるユーザーに変更してから、別のユーザーにコンテキストスイッチを設定すると、その変更が上書きされてから戻ってきて、アプリが想定どおりの状態になっていない可能性があります。

組み込みのメンバーシップシステムは、実行中に内部データが変更されるようには設計されていません。複数のアプリケーションに単一のデータベースを使用するように設計されています。

テナントごとに個別のデータベースを使用する場合は、独自の認証システムを実装する必要があります。これは、メンバーシップが希望する状況では機能しないためです。最初は機能しているように見えるかもしれませんが、サイトの同時ユーザー数が増えるにつれて、時限爆弾があなたの顔を爆破するのを待っています。

于 2012-10-17T01:49:04.350 に答える