다음을 통해 공유


연결에 대한 가장 및 자격 증명

적용 대상: SQL Server

SQL Server CLR(공용 언어 런타임) 통합에서는 Windows 인증을 사용하는 것이 복잡하지만 SQL Server 인증을 사용하는 것보다 더 안전합니다. Windows 인증을 사용하는 경우 다음 사항을 고려하십시오.

기본적으로 Windows에 연결하는 SQL Server 프로세스는 SQL Server Windows 서비스 계정의 보안 컨텍스트를 얻습니다. 그러나 CLR 함수를 프록시 ID에 매핑하여 아웃바운드 연결이 Windows 서비스 계정과 다른 보안 컨텍스트를 가질 수 있습니다.

경우에 따라 서비스 계정으로 실행하는 대신 SqlContext.WindowsIdentity 속성을 사용하여 호출자를 가장할 수 있습니다. WindowsIdentity 인스턴스는 호출 코드를 호출한 클라이언트의 ID를 나타내며 클라이언트가 Windows 인증을 사용하는 경우에만 사용할 수 있습니다. WindowsIdentity 인스턴스를 가져온 후 Impersonate를 호출하여 스레드의 보안 토큰을 변경한 다음 클라이언트를 대신하여 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 ID 인스턴스를 가져온 경우 기본적으로 해당 인스턴스를 다른 컴퓨터로 전파할 수 없습니다. Windows 보안 인프라는 기본적으로 이를 제한합니다. 그러나 여러 신뢰할 수 있는 컴퓨터에서 Windows ID를 전파할 수 있도록 하는 "위임"이라는 메커니즘이 있습니다. TechNet 문서 "Kerberos 프로토콜 전환 및 제한된 위임"에서 위임에 대해 자세히 알아볼 수 있습니다.

참고 항목

SqlContext 개체