1

私は現在、さまざまなユーザーがログインできるサイトを持っており、サブドメインに応じて、さまざまなデータベースからのさまざまなデータが表示されます。この投稿の指示に従って、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:単一のデータベースを持つこともできますが、特定のサブドメイン内のユーザーは、他のサブドメインのユーザーを表示せずに、自分のサブドメイン内のユーザーを追加/編集/削除する機能が必要です。このスキームの下でそれは可能でしょうか?

4

2 に答える 2

2

SQLMembershipProvider のコードは、ここで提供されます。プロジェクトをソリューションに追加し、web.config の名前空間参照を変更することで、必要と思われるものを拡張/変更できます。

于 2009-02-02T19:00:12.447 に答える
0

単一のメンバーシップ データベースを使用してすべてのログインを処理し、ログインしたドメインに応じて適切なデータベースに接続することで、これを正確に実行しました。

于 2009-02-02T18:40:53.610 に答える