2010-06-08 14 views
3

我熟悉.NET冒充帳戶使用:我可以使用屬性使.net冒充另一個用戶嗎?

dim myIdentity as WindowsIdentity = someIdentity 
using ctx as WindowsImpersonationContext = myIdentity.Impersonate() 
    doStuff() 
end using 

是否有可能定義一個.NET屬性,這樣我可以寫這樣的:

< runAsUser(someIdentity) > public sub doStuff() 

,然後讓.net框架在運行方法doStuff()時總是冒充?

更新 好吧,我被告知這可能是不可能的,因爲參數的構造函數必須是常量,這將排除傳遞用戶的身份。

讓我問一個稍微有點不同的問題: 假設有一個函數getUserWindowsIdentity()返回與登錄用戶關聯的身份。

然後我可以使用< runAsLoggedInUser) > public sub doStuff() >使框架在運行doStuff()方法時始終模擬getUserWindowsIdentity返回的用戶標識嗎?

回答

1

我相當肯定這不能完成。您也許能PostSharp模擬它(或類似)。

參數傳遞給Attribute構造函數必須常量,這意味着他們不能引用類型的。我會質疑代碼塊應該總是在相同的硬編碼憑據下運行的用例。

+0

如果在不傳遞參數參數的情況下很容易獲取,那麼屬性類是否可能被編碼以查找標識? – 2010-06-08 19:48:04

+0

是的,但您仍然必須擁有處理該屬性的其他代碼,並且實際上已對其執行了一些操作。作爲一般規則,屬性被用作從其他代碼反射的標記。 調用您的方法的代碼將需要加載和處理屬性,並實際執行模擬。如果您從同一位置調用多個方法,並且每個方法都需要使用不同的預定義憑據運行,那麼我可以看到一些潛在的好處。 – Toby 2010-06-08 20:05:16

2

不,.NET framework中不存在這樣的魔術。你必須自己編寫代碼,使用Reflection來讀取屬性。該代碼看起來很像您已有的代碼,只是速度較慢,並且代碼可以讀取添加的屬性。

+1

我想他不是問它是否存在,而是如果它可能*定義這樣一個屬性/標籤這樣做。 – 2010-06-08 19:30:41

0

我不是專家,所以我會向其他答覆者承認,你不能按照你的建議這樣做,但你可能會寫出看起來像你想要的方式的代碼與您一直使用的代碼一樣快。

如果您在預處理器指令中編寫了一個用using塊替換屬性標記,那麼您幾乎可以得到兩全其美的好處。這可能可以通過運行源代碼的腳本來實現。

1

如果您控制:a)調用doStuff()方法的代碼或b)doStuff()的調用方獲取對實現doStuff()的對象/類的引用的方法,則你可以完成你正在尋找的東西。 b)項是首選。

如果可以的話,請查看動態代理 - http://www.castleproject.org/dynamicproxy/index.html。不是返回有問題的對象/類的實際實例,而是返回實例的代理。當調用者調用該方法時,代理首先會看到它。在代理的實現中,在被調用的方法上查找屬性,如果找到,則啓動模擬。

甄子丹

1

正如其他人回答,您可以創建一個屬性,將做「工作」,但一直沒有什麼明確指出的是,有沒有自定義屬性,你可以創建一個運行時或框架組件將代表您執行。所以,你可以創建諸如屬性:

public class RunAsUserAttribute : Attribute 
{ 
    // implement some attribute functionality here 
} 

,然後你可以使用該屬性上的方法或類:

[RunAsUser] 
public void DoStuff() 
{ 
    // do some stuff as the impersonated user 
} 

什麼組件去調用的RunAsUserAttribute類的功能?您可以按照soccerdad的建議將這種功能放入動態代理中。這是解決問題的一種方法。

乾杯。

相關問題