【问题标题】:A .NET custom attribute to perform impersonation?用于执行模拟的 .NET 自定义属性?
【发布时间】:2009-08-18 20:41:07
【问题描述】:

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

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. 你能告诉我一些可以避免代码重复的东西吗?

提前致谢。

【问题讨论】:

    标签: .net security impersonation custom-attributes


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 我没有意识到属性只是数据,需要一个框架来让它“做事”。
    【解决方案2】:

    我不认为属性是实现此类功能的最佳方式。在大多数情况下,属性仅充当类型和成员的元数据(除了面向方面的东西)。您需要编写一些内容来检查该属性,并相应地重新路由方法调用。如果你已经有一些 AOP 代码,这应该不是一件苦差事,但如果你没有,你可能会得到更好的服务:

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

    然后这样称呼它:

    DoWorAsUser(token, MyMethod);
    

    这使您可以集中模拟代码,而不必搞乱反射、代码编织等。

    【讨论】:

    • 感谢您的回答...我希望我们有 AOP。顺便说一句,你的图标很棒。
    • 不客气!我没有将它放在示例中,但请确保将“op”调用包装在 try finally 块中并释放 WindowsIdentity 和 WindowsImpersonationContext 对象。
    猜你喜欢
    • 2011-01-24
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多