1

バックグラウンド:

挿入/削除/更新(および場合によっては読み取り)のデータベース監査を実行する必要があるWebアプリケーションがあります。ORMとしてLINQを使用しています。Webで見つけたいくつかのアイデアを使用して、属性を使用して、監査テーブルが関連付けられているエンティティを装飾する方法を考え出しました。監査テーブル自体には、現在のユーザーのIDと名前、変更タイプ、変更時間、および操作が成功したかどうかのフィールドに加えて、元のテーブルと同じタイプの同じ列を含める必要があります。監査はSubmitChanges中に行われます。データコンテキストは抽象的であり、具体的な実装でSubmitChangesを継承してオーバーライドします。抽象データコンテキストは、実際には、DataContextを拡張し、現在のユーザーIDと名前のプレースホルダーを持つCurrentUserプロパティを追加するAbstractAuditableDataContextから派生します。デフォルトでは、これらは0であり、ログインしているユーザーがいない場合は「システム」です。たとえば、登録中またはログイン中、ユーザーテーブルの特定のフィールドが更新される可能性があります。アプリケーションは、ASP.NET MVCを使用してC#で記述されています。

問題:

派生データコンテキストの現在のユーザープロパティを設定するための最良の方法は何ですか?CurrentUserが設定されているかどうかを確認し、設定されていない場合は入力するAuditUtilityに挿入されるユーティリティクラスを作成する必要があります。テストではこれをモックアウトしますが、ライブアプリケーションではおそらく遅延を使用します-セッションでロードして取得/設定します。または、この機能を実行するために(すべてのコントローラーで使用される)データコンテキストファクトリを変更する必要があります。私はユニットテスト中にすでにモックファクトリを使用しているので、これには新しいクラスの作成は含まれません。または、ファクトリの外部で派生を実行し、コンテキストの作成中に現在のユーザーを注入する必要があります。これにより、「代理」監査を行うことができます。

これは主観的なものだと思いますが、ご意見・ご感想をお寄せいただければ幸いです。

ありがとう。

4

4 に答える 4

1

Windows またはフォーム認証を使用している場合は、何も渡さずに HttpContext を確認できます。Web コンテキストでない場合は、スレッドからユーザーを取得します。多分:

if(HttpContext.Current != null)
{
    //grab the user from the HttpContext
}
else
{
    //grab the user from the Thread
}
于 2009-02-26T16:32:07.003 に答える
1

System.Threading.Thread.CurrentPrincipalあなたが探している答えを与えるはずです。

于 2009-02-26T16:35:29.507 に答える
0

最終的に、現在のデータコンテキストを取得し、HttpContext.User.Identityの現在のユーザー名に対応するユーザーオブジェクトを取得するGetAuditUserメソッドを持つCurrentUserUtilityBaseクラスを作成しました。このオブジェクトを使用して、現在のユーザーのIDと表示名を抽出し、これらのプロパティを含むAuditUserオブジェクトを作成して返します。

実装クラスはファクトリを使用してデータコンテキストのインスタンスを取得し、このデータコンテキストで基本クラスメソッドを呼び出します。私のデータコンテキストのファクトリメソッドは、現在のユーザーユーティリティを使用して、コンテキストの現在のユーザーを作成後にコンテキストに挿入します。

于 2009-03-25T16:27:13.463 に答える