2009-08-18 25 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)。您需要編寫一些內容來檢查該屬性,並相應地重新路由該方法調用。如果你已經有到位一些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。順便說一句,你的圖標真棒。 – 2009-08-18 20:53:02

+0

不客氣!我沒有把它放在這個例子中,但是確保你在try finally finally塊中包裝你的'op'調用並且處置WindowsIdentity和WindowsImpersonationContext對象。 – akmad 2009-08-19 21:17:57

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

謝謝 - 我沒有意識到的屬性只是數據,並需要一個框架,讓它「做東西」。 – 2009-08-18 21:58:44