2010-05-17 33 views
0

是否有任何內置功能來確定程序集是否從特定程序集調用?確保通過指定程序集調用程序集

我有程序集A,其中引用程序集B。程序集A公開了在B中找到的PowerShell cmdlet和輸出類型。 B公開的某些方法和屬性對於彙編A中的類型感興趣,但對PowerShell的消費者不感興趣,或者任何試圖直接在B中加載類型並調用其中的方法的任何人感興趣。

我查看了InternalsVisibleToAttribute,但由於使用了接口,因此需要大量的返工。我正在設計一個共享密鑰系統,以後會被混淆,但看起來很笨重。

有什麼方法可以確保B僅被A調用?

+1

那麼,爲什麼你需要強迫人們不要使用他們甚至不感興趣的東西? – SamB 2010-06-05 20:05:18

+0

而且,如果事實證明你想阻止人們做他們實際上有興趣做的事情,那麼這可能不會對付一個即使是輕度決心的對手 - 也不可能很難替代組件上的簽名(帶有來自不同鍵的簽名)並更改任何硬編碼鍵以匹配... – SamB 2010-06-05 20:10:25

回答

4

的另一個選項檢查您可以使用裝配上的強名稱鍵來執行此操作。

首先確保調用組件(組件A)是強名稱簽名(這可以在項目屬性進行簽名選項卡下的屏幕)

下面的代碼將檢索調用程序集強名稱密鑰。

internal static StrongName GetStrongName(Evidence evidence) 
{ 
    foreach (var e in evidence) 
    { 
     if (e is StrongName) 
     { 
      return (StrongName)e; 
     } 
    } 
    throw new ArgumentException(); 
} 

最簡單的方法是用相同的強名稱簽署這兩個組件,然後驗證Assembly.GetCallingAssembly()證據和Assembly.GetExecutingAssembly()。證據是由同一強名稱簽名。

var callerKey = GetStrongName(Assembly.GetCallingAssembly().Evidence).PublicKey; 
var execKey = GetStrongName(Assembly.GetExecutingAssembly().Evidence).PublicKey; 

if (callerKey != execKey) 
{ 
    throw new UnauthorizedAccessException("The strong name of the calling assembly is invalid."); 
} 

這可能是不切實際的實現在現有的代碼庫,但是看看LinFu AOP,你應該能夠實現一個可以連接到需要被檢查的有效呼叫者類的屬性。