模擬和 CLR 整合安全性
當 Managed 程式碼存取外部資源時,SQL Server 不會自動模擬用來執行常式的目前執行內容。 EXTERNAL_ACCESS 和 UNSAFE 組件中的程式碼可以明確模擬目前的執行內容。
[!附註]
如需模擬中行為變更的詳細資訊,請參閱<SQL Server 2012 中對於 Database Engine 的重大變更>。
同處理序資料存取提供者會提供應用程式開發介面 SqlContext.WindowsIdentity,可用來擷取與目前安全性內容相關聯的 Token。 EXTERNAL_ACCESS 和 UNSAFE 組件中的 Managed 程式碼可以使用這個方法來擷取此內容並使用 .NET Framework WindowsIdentity.Impersonate 方法來模擬該內容。 使用者程式碼明確模擬時適用下列限制:
當 Managed 程式碼處於模擬狀態時,不允許同處理序資料存取。 程式碼可以恢復模擬,然後呼叫同處理序資料存取。 請注意,這樣做需要儲存原始 Impersonate 方法的傳回值 (WindowsImpersonationContext 物件),以及針對這個 WindowsImpersonationContext 呼叫 Undo 方法。
這項限制表示進行同處理序資料存取時,一定會在適用於工作階段之目前安全性內容的內容中進行, 無法由 Managed 程式碼內部的明確模擬所修改。
若為以非同步方式執行的 Managed 程式碼 (例如,透過 UNSAFE 組件,建立執行緒並以非同步方式執行程式碼),永遠不允許同處理序資料存取。 不論是否存在模擬,這項限制都成立。
執行程式碼所在的模擬內容與 SQL Server 不同時,它就無法執行同處理序資料存取呼叫。它應該先恢復模擬內容,然後再進行同處理序資料存取呼叫。 從 Managed 程式碼進行同處理序資料存取時,進入 Managed 程式碼之 Transact-SQL 進入點的原始執行內容一定會用於授權。
除非 EXTERNAL_ACCESS 組件和 UNSAFE 組件依照先前所述的方式主動模擬目前的安全性內容,否則它們會使用 SQL Server 服務帳戶來存取作業系統資源。 因此,EXTERNAL_ACCESS 組件的作者比 SAFE 組件的作者需要更高的信任層級,而此信任層級是由 EXTERNAL ACCESS 登入層級權限所指定。 只有受信任可在 SQL Server 服務帳戶底下執行程式碼的登入才應該被授與 EXTERNAL ACCESS 權限。