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