2009-08-18 10 views
0

私は特定のサービスアカウントとして実行する必要があるいくつかのメソッドを持っているので、私は通常のことを実行します。偽装を実行する.NETカスタム属性?

public DoSomeWorkAsServiceAccount() { 
    ... 
    // assume I am given tokenHandle 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    ... 
    // do the work here 
    ... 

    impersonatedUser.Undo(); 
} 

を私はあらゆる方法で、このコードを書き込まないようしたいと思いますので、私が作成を考えていましたカスタム属性:

だからここ
[Impersonate(tokenHandle)] 
public DoSomeWorkAsServiceAccount() { 
    // do the work 
} 

私の質問です:

  1. が、これは可能ですか?
  2. コードの重複を避けるために何かを表示できますか?

ありがとうございます。

答えて

2

属性は、このような機能を実装する最善の方法ではないと思います。ほとんどの場合、属性は単にタイプとメンバーのメタデータとして機能します(Aspect Oriented stuff aside)。その属性を調べるために何かを書く必要があり、それに応じてメソッド呼び出しを再ルーティングする必要があります。あなたはすでに場所にいくつかのAOPコードを持っている場合、これは雑用の多くではありませんが、あなたがいない場合、あなたはおそらくより良い、このような何かによって提供されたい:

public void DoWorkAsUser(tokenHandle, Action op) 
{ 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    op(); 

    impersonatedUser.Undo(); 
} 

そして、のようなそれを呼び出しますこれは: - 私は属性がデータだけだった、との枠組みが必要だったことを実現していなかった

DoWorAsUser(token, MyMethod); 

これは、codeweaving、周りの反射を台無しにすることなく、など

+0

答えをありがとう...私は私たちがAOPをしたかった。そして、あなたのアイコンは最高です。 –

+0

あなたは大歓迎です!私は例に入れなかったが、あなたの 'op'呼び出しをfinallyブロックでラップして、WindowsIdentityとWindowsImpersonationContextオブジェクトを破棄してください。 – akmad

4

コードはありませんが、これを行うにはPostSharpをお試しください。 OnMethodInvocationAspectを作成すると、メソッドコードを呼び出す前にセキュリティを整理できます。例:

public class ImpersonateAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation(MethodInvocationEventArgs eventArgs) 
    { 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    eventArgs.Proceed() // Call the code in the actual method. 

    impersonatedUser.Undo(); 
    } 
} 

上記は完全な推測ですが、それを示唆すると、私はあなたに有効なオプションを与えている可能性があります。

+0

感謝を偽装コードを集中管理することができますそれを "やる"ようにする。 –

関連する問題