模拟和 CLR 集成安全性
当托管代码访问外部资源时,SQL Server不会自动模拟正在执行例程的当前执行上下文。 EXTERNAL_ACCESS
和 UNSAFE
程序集中的代码可以显式模拟当前执行上下文。
注意
有关模拟中的行为更改的信息,请参阅 SQL Server 2014 中数据库引擎功能的中断性变更。
进程内数据访问提供程序提供了一个应用程序编程接口 SqlContext.WindowsIdentity
,该接口可用于检索与当前安全上下文有关的令牌。 EXTERNAL_ACCESS
和 UNSAFE
程序集中的托管代码可使用此方法检索上下文并使用 .NET Framework WindowsIdentity.Impersonate
方法模拟该上下文。 当用户代码显式模拟时,适用下列限制:
托管代码处于模拟状态时,不允许进程内数据访问。 代码可以撤消模拟,然后调用进程内数据访问。 请注意,这需要存储原始
WindowsImpersonationContext
方法的返回值(Impersonate
对象)并对该Undo
调用WindowsImpersonationContext
方法。该限制意味着当出现进程内数据访问时,实际它将始终位于该会话当前安全上下文的上下文中。 在托管代码内无法通过显式模拟对此进行修改。
为异步执行托管代码(例如通过
UNSAFE
程序集创建线程并异步运行代码),从不允许进程内数据访问。 无论是否存在模拟,结果都将为 True。
如果代码在不同于 SQL Server 的模拟上下文中运行,则不能执行进程中数据访问调用;在进行进程中数据访问调用之前,应取消模拟上下文。 从托管代码进行进程中数据访问时,始终使用托管代码的 Transact-SQL 入口点的原始执行上下文进行授权。
程序集和UNSAFE
程序集都EXTERNAL_ACCESS
使用 SQL Server 服务帐户访问操作系统资源,除非它们按照前面所述自愿模拟当前安全上下文。 因此,EXTERNAL_ACCESS
程序集的作者需要具有比 SAFE
程序集的作者更高的信任级别,该级别由 EXTERNAL ACCESS
登录级别权限指定。 应仅向信任在 SQL Server 服务帐户下运行代码的登录名授予EXTERNAL ACCESS
权限。