2

トリガーベースのアプローチを使用してログを監査し、データベース内のテーブルに加えられた変更の履歴を記録しています。どのユーザーが変更を行ったかを記録するために (静的 SQL サーバー ログインで) 使用しているアプローチには、各データベース接続の最初にストアド プロシージャを実行することが含まれます。トリガーは、監査行を記録するときにこのユーザー名を使用します。(トリガーは製品 OmniAudit によって提供されます。)

ただし、ASP.NET メンバーシップ テーブルには、主にメンバーシップ API を介してアクセスします。メンバーシップ API がデータベース接続を開くときに、現在のユーザーの ID を渡す必要があります。MembershipProvider のサブクラス化を試みましたが、基になるデータベース接続にアクセスできません。

これは一般的な問題のようです。ASP.NET メンバーシップがデータベース接続を確立するときにアクセスできるフックを知っている人はいますか?

4

1 に答える 1

1

更新 2: AOP の面では見栄えがよくありません。残念ながら、所有しておらず、作成していないオブジェクトで静的メソッドをインターセプトすることは可能ですか? を参照してください。

コメントでほのめかされているように、Provider Toolkit のプロバイダーの実装を使用し、フックを配線するのが最善の策のようですSqlConnectionHelper.GetConnection()

私はツールキット コードを大幅にクリーンアップして、何年も問題なく確実に使用しています。興味があれば、4.0 で確認してパッケージ化させてください。


アップデート:

わかりました、私はあなたの必要性をよりよく理解していると思います。私が正しいかどうか教えてください:

プロバイダーが使用している実際の接続が必要ですか?

SqlMembershipProvider は、System.Web.DataAccess.SqlConnectionHolderすべてのデータ アクセスにヘルパー クラスを利用します。

私はこれを行っていませんが、私が集めたものから、Castle DynamicProxy (またはそれを活用するライブラリの 1 つ) などの AOP 実装を使用してこのオブジェクトを構築する呼び出しをインターセプトし、そこに接続することができます。

より多くの経験を持つ誰かがこれを確認または否定できますか?


元の答え:

SqlMembershipProvider から派生させる必要はありません。中に入って、必要なものを手に入れてください。

string connectionString = 
   typeof(SqlMembershipProvider)
   .GetField("_sqlConnectionString",BindingFlags.NonPublic | BindingFlags.Instance)
   .GetValue(Membership.Provider);
于 2010-05-26T09:26:19.733 に答える