模拟和 CLR 集成安全性

当托管代码访问外部资源时,SQL Server不会自动模拟正在执行例程的当前执行上下文。 EXTERNAL_ACCESSUNSAFE 程序集中的代码可以显式模拟当前执行上下文。

注意

有关模拟中的行为更改的信息,请参阅 SQL Server 2014 中数据库引擎功能的中断性变更

进程内数据访问提供程序提供了一个应用程序编程接口 SqlContext.WindowsIdentity,该接口可用于检索与当前安全上下文有关的令牌。 EXTERNAL_ACCESSUNSAFE 程序集中的托管代码可使用此方法检索上下文并使用 .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权限。

另请参阅

CLR 集成安全性
模拟和连接凭据