模拟和 CLR 集成安全性

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

注释

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

进程内数据访问提供程序提供一个应用程序编程接口, SqlContext.WindowsIdentity可用于检索与当前安全上下文关联的令牌。 托管代码 EXTERNAL_ACCESSUNSAFE 程序集可以使用此方法检索上下文,并使用 .NET Framework WindowsIdentity.Impersonate 方法模拟该上下文。 当用户代码显式模拟时,以下限制适用:

  • 当托管代码处于模拟状态时,不允许进程内数据访问。 代码可以撤消模拟,然后调用进程内数据访问。 请注意,这需要存储原始Impersonate方法的返回值(对象WindowsImpersonationContext),并对此调用Undo该方法WindowsImpersonationContext

    此限制意味着当进程内数据访问发生时,它始终位于当前安全上下文的上下文中,该上下文对会话有效。 不能通过托管代码中的显式模拟来修改它。

  • 对于异步执行托管代码(例如,通过 UNSAFE 程序集创建线程和异步运行代码),绝不允许进程内数据访问。 无论是否存在模拟,都是如此。

当代码在与 SQL Server 不同的模拟上下文中运行时,它无法执行进程内数据访问调用;在进行进程内数据访问调用之前,它应撤消模拟上下文。 从托管代码进行进程内数据访问时,Transact-SQL 入口点的原始执行上下文始终用于授权。

程序集和UNSAFE程序集都EXTERNAL_ACCESS使用 SQL Server 服务帐户访问作系统资源,除非它们自愿模拟当前安全上下文,如前所述。 因此,程序集的 EXTERNAL_ACCESS 作者需要比 SAFE 登录级别权限指定的 EXTERNAL ACCESS 程序集更高的信任级别。 仅应向受信任的登录名授予 SQL Server 服务帐户下运行代码的 EXTERNAL ACCESS 登录名。

另请参阅

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