共用方式為


模擬和 CLR 整合安全性

當 Managed 程式代碼存取外部資源時,SQL Server 不會自動模擬目前正在執行例程的執行內容。 和 UNSAFE 元件中的EXTERNAL_ACCESS程式代碼可以明確模擬目前的執行內容。

備註

如需模擬行為變更的相關信息,請參閱 SQL Server 2014 中 Database Engine 功能的重大變更

同進程數據存取提供者提供應用程式程式設計介面 SqlContext.WindowsIdentity,可用來擷取與目前安全性內容相關聯的令牌。 和 UNSAFE 元件中的 EXTERNAL_ACCESS 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需要比登入層級許可權所EXTERNAL ACCESS指定的元件更高的信任SAFE層級。 只有信任在 SQL Server 服務帳戶下執行程式代碼的登入才應獲得 EXTERNAL ACCESS 許可權。

另請參閱

CLR 整合安全性
線上的模擬和認證