私は現在、さまざまなユーザーがログインできるサイトを持っており、サブドメインに応じて、さまざまなデータベースからのさまざまなデータが表示されます。この投稿の指示に従って、Initializeメソッド中に動的に設定した「temp」接続文字列を使用するようにSqlMembershipProviderをオーバーライドしています。
http://forums.asp.net/p/997608/2209437.aspx
public override void Initialize(string name, NameValueCollection config)
{
// intercept the setting of the connection string so that we can set it ourselves...
string specifiedConnectionString = config["connectionStringName"];
ConnectionStringSettings connectionString = ConfigurationManager.ConnectionStrings[specifiedConnectionString];
var fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(connectionString, false);
connectionString.ConnectionString = WakeflyClientHelper.GetClientConnectionStringByCurrentSubdomain();
config["connectionStringName"] = connectionString.Name;
// Pass doctored config to base classes
base.Initialize(name, config);
}
問題は、SqlMembershipProviderクラスが「静的」に見えることです。複数のユーザーが異なるサブドメインから接続すると、それぞれのデータベースではなく、いずれかのデータベースのユーザーアカウントが表示されることになります。Initializeは、リクエストごとではなく、アプリケーションによって呼び出されているようです。
だからあなたへの私の質問は...これに対する解決策を実装する最も簡単な方法は何でしょうか?
私はこれまでカスタムプロバイダーを作成したことがないので、それがどのように機能するのか、またはどのような制限があるのかわかりません。そして、自分で書いた場合、何かを見落とすとセキュリティホールが発生する可能性が常にあります(時間がかかることは言うまでもありません)。何か案は?
更新1:単一のデータベースを持つこともできますが、特定のサブドメイン内のユーザーは、他のサブドメインのユーザーを表示せずに、自分のサブドメイン内のユーザーを追加/編集/削除する機能が必要です。このスキームの下でそれは可能でしょうか?