接続の権限借用と資格情報

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 2008 では、権限借用の動作が変更されています。詳細については、「SQL Server 2008 におけるデータベース エンジン機能の重大な変更」を参照してください。

Microsoft Windows ID インスタンスを取得した場合、既定では、そのインスタンスを別のコンピュータに反映できません。既定では、Windows セキュリティ インフラストラクチャによりこの操作が制限されます。ただし、"委任" というメカニズムを使用すると、信頼関係のある複数のコンピュータに Windows ID を反映できるようになります。委任の詳細については、TechNet の資料「Kerberos のプロトコル遷移と制約付き委任」を参照してください。

関連項目

概念