私は、ASP.NET メンバーシップ プロバイダーを使用する多くのアプリケーションを正常に構築してきました。マルチテナントの新しいプロジェクトに飛び込んでおり、複数の SQL Server データベース間でユーザー アカウントを分割することで拡張性を高めています。
各データベースにはメンバーシップ スキーマがインストールされており、Web.Config ファイルに情報を追加することで、データベースのいずれかをメンバーシップ プロバイダーとして問題なく設定できます。ただし、私の目標は、マスター データベースをルックアップ テーブルとして使用することです。このデータベースには「Accounts」というテーブルがあり、そのアカウントのメンバーシップ データベースを「MebershipPartition」というフィールドに保存します。このフィールドは、そのテーブル内のそのアカウントのユーザーに関連付けられています (各アカウントには多くのユーザーを含めることができます)。
余分な情報が削除された基本的なアーキテクチャは次のとおりです。
私がやろうとしているのは、ルックアップを行った後、更新された接続文字列 (または、これはすべて同じ SQL Server 上にあるため、databaseName だけでも) を介して、メンバーシップ プロバイダーをその特定のプロバイダー データベースに設定することです。これは、Web.Config および Global.asax ファイルの外部で発生する必要があることを意味します。
また、利用可能な接続文字列のリストを使用して Web.Config を事前設定することもできません。これは、以前のデータベースまたは特定のアカウントで特定の上限に達するなど、特定の基準が満たされるたびにシステムが新しいメンバーシップ データベースを生成する可能性があるためです。ユーザーは個々のデータベースに分離されます。したがって、これは完全に動的でなければなりません。
私の研究では、次の投稿で詳しく説明されている多くの方法を試しました。
StackOverflow、ASP.NET フォーラム、ASP.NET フォーラム
上記の解決策はどれも期待どおりに機能しません。アプリケーションのライフサイクルの早い段階でソリューションを実行することに依存しているか、接続文字列にハードコードされた値を使用して、Web.Config への依存を取り除くという問題のみを解決しています。
理想的には、必要に応じてメンバーシップ システムが使用するデータベースを切り替えるために、C# クラスからいつでも呼び出すことができる単一のメソッドを公開したいと考えています。次に例を示します。
string Membership_DB_1 = "Server=[server];Database=database1;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_2 = "Server=[server];Database=database2;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_3 = "Server=[server];Database=database3;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
Membership.SwitchConnectionString(Membership_DB_1);
Membership.SwitchConnectionString(Membership_DB_2);
Membership.SwitchConnectionString(Membership_DB_3);
事前にコミュニティに感謝したいと思います。私はこのシナリオに何日も (そして今では数週間も) 取り組んできましたが、別のソリューションに移行する段階に近づいています!
更新しました:
私は次の解決策も検討していますが、繰り返しになりますが、事前にすべての潜在的な接続文字列を使用して Web.Config を設定する必要があり、これは管理の観点からは望ましくありません。
これは不可能ですか?次に、Microsoft が提供するプロバイダー ツールキット サンプルを使用して、独自のバージョンのメンバーシップ プロバイダーを展開することを検討しますが、利用可能なサンプルやドキュメントは多くなく、実際のダウンロード ページが動作していません! Scott Guthrieは 2005 年にそれについて投稿しましたが、ご覧のとおり、記事内の参照は現在欠落しています。MSI here へのダウンロードリンクを見つけましたが、コードが適切に維持されているか、まだ関連性があるかどうかはわかりません...
これを Provider コンポーネントに深く入り込むことを避けようとしていましたが、前進し続けるつもりです! 同じことをしようとしている他の人のために行くので、このスレッドを更新し続けます!