この動的ログイン スキームを asp.net に実装する最も簡単な方法
-
21-08-2019 - |
質問
現在、さまざまなユーザーがログインできるサイトがあり、サブドメインに応じて、さまざまなデータベースからのさまざまなデータが表示されます。この投稿の手順に従って、「一時」接続文字列を使用するように SqlMembershipProvider をオーバーライドしています。これは、Initialize メソッド中に動的に設定します。
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);
}
問題は、複数のユーザーが異なるサブドメインから接続すると、最終的に各ユーザーではなくデータベースの 1 つのユーザー アカウントが表示されるため、SqlMembershipProvider クラスが「静的」であるように見えることです。Initialize はリクエストごとではなく、アプリケーションによって呼び出されるように見えます。
そこで私からあなたへの質問は...これに対する解決策を実装する最も簡単な方法は何でしょうか?
これまでカスタム プロバイダーを作成したことがないため、それがどのように機能するのか、またどのような制限があるのかがわかりません。また、自分で作成すると、何かを見落とした場合にセキュリティ ホールが発生する可能性が常にあります (時間がかかることは言うまでもありません)。何か案は?
アップデート 1:データベースを 1 つだけ持つこともできますが、特定のサブドメイン内のユーザーは、他のサブドメインのユーザーを表示せずに、自分のサブドメイン内のユーザーを追加/編集/削除できる必要があります。この制度ではそれが可能でしょうか?
解決
SQLMembershipProvider のコードが提供されます ここ. 。プロジェクトをソリューションに追加し、web.config の名前空間参照を変更することで、必要と思われるものを拡張/変更できます。
他のヒント
私は、単一のメンバーシップ データベースを使用してすべてのログインを処理し、ログインしたドメインに応じて適切なデータベースにログインすることをまさに実行しました。