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 回答