我有一些方法,需要运行为的某些服务的帐户,所以我做正常事情:

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. 你能告诉我东西,这将避免重复代码?

在此先感谢。

有帮助吗?

解决方案

我不认为一个属性是最好的方式来实现一个功能,这样。大部分属性只是作为元数据的类型和成员(面向方面的东西搁置).你会需要写什么检查的这一特性,并重新路线的方法调整。如果你已经有一些AOP的代码,在地方,这不应该是一个苦差事,但是如果你没有,你很可能是更好的服务通过这样的事情:

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

  op();

  impersonatedUser.Undo();
}

然后叫它是这样的:

DoWorAsUser(token, MyMethod);

这可以让你集中模拟码不必要的混乱与周围的反思,codeweaving,等等。

其他提示

我已经没有任何代码,但是你可以尝试使用 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();
  }
}

上述是一个完整的猜测,但通过建议的,我可以给你一个有效的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top