模拟和连接凭据

适用于:SQL Server

在SQL Server公共语言运行时 (CLR) 集成,使用 Windows 身份验证很复杂,但比使用SQL Server身份验证更安全。 使用 Windows 身份验证时,请谨记下列注意事项:

默认情况下,连出至 Windows 的 SQL Server 进程会获得 SQL Server Windows 服务帐户的安全上下文。 但可以将 CLR 函数映射到代理标识上,以便其出站连接具有的安全上下文不同于 Windows 服务帐户的安全上下文。

在某些情况下,你可能希望使用 SqlContext.WindowsIdentity 属性来模拟调用方,而不是作为服务帐户运行。 WindowsIdentity 实例表示调用代码的客户端的标识,仅在客户端使用 Windows 身份验证时可用。 获取 WindowsIdentity 实例后,可以调用 模拟 来更改线程的安全令牌,然后代表客户端打开 ADO.NET 连接。

调用 SQLContext.WindowsIdentity.Impersonate 后,无法访问本地数据,也无法访问系统数据。 若要再次访问数据,必须调用 WindowsImpersonationContext.Undo。

以下示例演示如何使用 SqlContext.WindowsIdentity 属性模拟调用方。

Visual C#

WindowsIdentity clientId = null;  
WindowsImpersonationContext impersonatedUser = null;  
  
clientId = SqlContext.WindowsIdentity;  
  
// This outer try block is used to protect from   
// exception filter attacks which would prevent  
// the inner finally block from executing and   
// resetting the impersonation.  
try  
{  
   try  
   {  
      impersonatedUser = clientId.Impersonate();  
      if (impersonatedUser != null)  
         return GetFileDetails(directoryPath);  
         else return null;  
   }  
   finally  
   {  
      if (impersonatedUser != null)  
         impersonatedUser.Undo();  
   }  
}  
catch  
{  
   throw;  
}  

注意

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

此外,如果获取了 Microsoft Windows 标识实例,则默认情况下无法将该实例传播到另一台计算机;默认情况下,Windows 安全基础结构会限制这一点。 然而,存在一种称为“委托”的机制,通过该机制可在多个可信任的计算机之间启用 Windows 标识传播。 可以在 TechNet 文章“Kerberos 协议转换和约束委派”中了解有关委派的详细信息。

另请参阅

SqlContext 对象