2008-08-21 29 views
5

我想測試部分信任環境中某段.NET代碼的行爲。什麼是最快的方式來設置呢?隨意假定我(和其他讀者)是全部CAS noobs。在部分信任環境中測試.NET代碼

@Nick:謝謝你的回覆。唉,有問題的工具是明確的非託管代碼。在我的問題中,我沒有說「管理」,也不應該假定人們會從「.NET」標記中推斷出它。

回答

3

這是一個很好的問題,特別是從TDD的角度來看,並驗證不同信任場景下的代碼。

我想我會處理這個的辦法是沿着線的東西 -

  • 在使用AppDomain.CreateDomain()過載,使您可以在通過我的TDD的代碼創建一個AppDomain PermissionSet中。 PermissionSet將被構建爲匹配您想要測試的不同信任方案。

  • 負載含有下測試邏輯到應用程序域

  • 組件創建的類型/調用方法等中的應用程序域,陷阱安全異常

東西有點像該實例。我還沒有時間敲定一個概念證明呢。

1

使用Microsoft Application Verifier

AppVerifier的幫助確定:

  • 當應用程序正確使用API​​: (不安全TerminateThread的API,正確使用線程本地存儲(TLS的)的API,鄰正確使用虛擬空間操作的(。例如,的VirtualAlloc,MapViewOfFile)。
  • 應用程序是否使用結構化異常處理隱藏訪問衝突。
  • 應用程序是否試圖使用無效的句柄。
  • Whethe r堆中有內存損壞或問題。
  • 應用程序是否在資源不足的情況下耗盡內存。
  • 是否發生關鍵部分的正確使用。
  • 在管理環境中運行的應用程序是否可以在特權較低的環境中正常運行。
  • 應用程序作爲受限用戶運行時是否存在潛在問題。
  • 線程上下文中未來函數調用中是否存在未初始化的變量。
1

您應該看看.NET Framework配置工具。這是在.NET SDK,你可以在這裏上運行它找到的指令...... http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx

運行安全策略部分,你會發現3策略級別:企業,計算機和用戶。如果您鑽入機器或用戶,您會發現代碼組定義權限集。當你說你想在部分信任環境中測試一些.NET代碼時,我想你會想根據已經定義的標準權限集之一進行測試,例如Internet。您需要定義一個代碼組,它與您的應用程序(或特定程序集)相匹配,並將您選擇的權限集分配給代碼組

您也可以定義您自己的自定義權限集,但現在讓我們保持簡單。

選擇您希望您的新代碼組在機器範圍內存在,還是僅存在於您的用戶帳戶,並相應地鑽入機器或用戶策略級別。您會看到一個名爲_All _ Code_的代碼組。創建一個子碼組一個內,通過右鍵單擊並選擇新建...

給它一個名字,說PartialTrustGroup,然後單擊下一步

您必須爲此組指定成員資格條件,並且存在各種類型。我想在我的機器上創建一個名爲PartialTrust的特定文件夾,然後創建一個匹配的URL成員資格條件。因此,我的網址如下所示... file:// c:/ users/martin/documents/partialtrust/*

*是通配符,用於捕獲該路徑下的任何程序集。點擊下一頁

現在您可以爲您的新代碼組選擇一個權限。目前,請選擇互聯網。這是一個相當嚴格的集合,類似於Java applet沙箱。點擊下一步完成

現在右鍵單擊您的新代碼組,然後選擇屬性。在常規選項卡中,確保選中最上面的複選框,然後單擊確定。

現在,從指定的URL下的某個位置加載的任何.NET程序集都將對其應用Internet權限集。如果您沒有編寫代碼仔細觀察縮減的權限集,那麼預計會得到一些SecurityExceptions。

對不起,這是一個很長的描述。它確實比聽起來簡單得多。

3

你要找的是內置到Visual Studio的功能:

你的項目的安全選項卡中,有一個「高級」按鈕,讓你配置是否要在調試完全信任或指定的信任級別。

+0

+1這只是幫了我很多謝謝。 – 2011-02-14 13:35:54

1

我剛在博客上發佈了一篇名爲Partial Trust Testing with xUnit.net的文章。它詳細介紹了我們在Entity Framework團隊中使用的基於xUnit.net的框架以中等信任度來執行代碼。

下面是它的用法的一個例子。

public class SomeTests : MarshalByRefObject 
{ 
    [PartialTrustFact] 
    public void Partial_trust_test1() 
    { 
     // Runs in medium trust 
    } 
} 

// Or... 

[PartialTrustFixture] 
public class MoreTests : MarshalByRefObject 
{ 
    [Fact] 
    public void Another_partial_trust_test() 
    { 
     // Runs in medium trust 
    } 
}