0

特定のサービスアカウントとして実行する必要があるメソッドがいくつかあるので、通常のことを行います。

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. コードの重複を避けるための何かを見せてもらえますか?

前もって感謝します。

4

2 に答える 2

3

コードはありませんが、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();
  }
}

上記は完全な推測ですが、それを提案することによって、私はあなたに有効なオプションを与えたかもしれません。

于 2009-08-18T20:49:06.503 に答える
2

このような機能を実装するには、属性が最善の方法ではないと思います。ほとんどの場合、属性はタイプとメンバーのメタデータとして機能するだけです(アスペクト指向のものは別として)。その属性をチェックするために何かを記述し、それに応じてメソッド呼び出しを再ルーティングする必要があります。すでにいくつかのAOPコードを配置している場合、これは面倒な作業ではないはずですが、そうでない場合は、次のようなものを使用した方がはるかに優れている可能性があります。

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

  op();

  impersonatedUser.Undo();
}

そしてそれをこのように呼びます:

DoWorAsUser(token, MyMethod);

これにより、リフレクションやコードウィービングなどをいじることなく、偽装コードを一元化できます。

于 2009-08-18T20:49:35.800 に答える