次の方法で共有


方法 : Windows 統合セキュリティを使用して SQL Server にアクセスする

更新 : 2007 年 11 月

アプリケーションを Windows ベースのイントラネットで実行するときは、Windows 統合認証を使用してデータベース アクセスを実行できる場合もあります。統合セキュリティでは、オペレーティング システム スレッド上に確立された現在の Windows ID を使用して、SQL Server データベースにアクセスします。次に、Windows ID を SQL Server データベースとアクセス許可に対応付けることができます。

Windows 統合認証を使用して SQL Server に接続するには、実行している ASP.NET アプリケーションの Windows ID を識別する必要があります。また、その ID に SQL Server データベースへのアクセス権を付与しておく必要があります。このトピックでは、ASP.NET アプリケーションの現在の Windows ID を表示するコード例について説明します。

SQL Server への接続

SQL Server が Web サーバーとは異なるコンピュータ上にある場合、ネットワークを経由して SQL Server のリモート インスタンスに Windows ID を渡すことができる必要があります (Kerberos 認証を使用して適切に構成されている Windows ネットワークでこれを行うことができます)。ただし、identity 構成要素の設定によっては、ASP.NET アプリケーションのオペレーティング システム スレッド上に確立された Windows ID をリモート SQL Server に正しく渡すことができない場合があります。

方法 : マップされた Windows ドメイン ユーザーを使用して SQL Server にアクセスする」に示すように、Web サイトのワーカー プロセス ID の特定のユーザー名とパスワードを渡したり、インターネット インフォメーション サービス (IIS: Internet Information Service) によって提供される認証済みの ID を偽装したりできます。IIS によって提供される Windows ID を偽装するには、次の例に示すように、identity 構成要素の impersonate 属性を true に設定します。

<system.web>
  <identity impersonate="true" />
</system.web>

IIS では、ユーザーは基本認証でのみ、ネットワークを経由してリモート SQL Server に渡されるセキュリティ トークンを使用してログオンできます。既定では、identity 構成要素設定と組み合わせて使用されるその他の IIS セキュリティ モードのトークンは、リモート SQL Server に対して認証されません。

Web サイトが IIS で匿名アクセスのみをサポートするように構成されている場合、IIS から渡されるセキュリティ トークンは IIS に構成された匿名アクセス用の Windows ユーザー アカウントのトークンになります。匿名ユーザー アカウントは、リモート SQL Server に対する認証に使用できます。ただし、既定の匿名ユーザー アカウントはローカル コンピュータ アカウントであるため、リモート SQL Server 上のアカウントとしては存在しません。ドメイン アカウントを使用するように IIS 匿名アカウントを変更したり、同じユーザー名とパスワードを使用してリモート SQL Server 上にローカル アカウントを作成することにより、リモート SQL Server 上のローカル コンピュータ アカウントをミラー化したりできます。また、IIS6 の LogonMethod メタベース プロパティを、ネットワークを経由して資格情報を渡すことができるオプションに設定する必要があります。たとえば、メタベース設定の MD_LOGON_NETWORK_CLEARTEXT では、ネットワーク経由でログオン資格情報を渡すことができます。

アプリケーションの Windows ID が不明な場合や、その ID がネットワークを経由して渡すことができるトークンでログオンするかどうかが不明な場合は、アプリケーションの一部として次の ASP.NET ページを実行すると、Windows ID の名前およびネットワークを経由してその ID を渡すことができるかどうかを示す値を表示できます。次の例では、ドメインに Kerberos 委任が正常に設定されているかどうかは考慮されていません。

<%@ Page Language="VB" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ASP.NET Example</title>
<script runat="server">

Public Function WillFlowAcrossNetwork(w As WindowsIdentity) As Boolean
  For Each s As SecurityIdentifier In w.Groups
    If s.IsWellKnown(WellKnownSidType.InteractiveSid) Then Return True
    If s.IsWellKnown(WellKnownSidType.BatchSid)       Then Return True
    If s.IsWellKnown(WellKnownSidType.ServiceSid)     Then Return True
  Next

  Return False
End Function

</script>
</head>
<body>
<%
  Dim current As WindowsIdentity =  WindowsIdentity.GetCurrent()
  Response.Write(current.Name & ", " & WillFlowAcrossNetwork(current) & "<br />")
%>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ASP.NET Example</title>
<script runat="server">

public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
  foreach (SecurityIdentifier s in w.Groups)
  {
    if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
    if (s.IsWellKnown(WellKnownSidType.BatchSid))       { return true; }
    if (s.IsWellKnown(WellKnownSidType.ServiceSid))     { return true; }
  }

  return false;
}

</script>
</head>
<body>
<%
  WindowsIdentity current =  WindowsIdentity.GetCurrent();
  Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>

次の手順は、イントラネットのシナリオで Windows 統合認証を使用して SQL Server データベースにアクセスする方法を示しています。ここでは、それぞれのユーザーに個別に SQL Server へのアクセス権が付与されています。

最初に、IIS でアプリケーションを設定して、匿名アクセスをオフにし、Windows 認証をオンに設定する必要があります。

Windows 統合認証用に IIS を設定するには

  1. Windows で、[インターネット インフォメーション サービス] 管理ツールを開きます。

    • Microsoft Windows 2000 Server または Windows Server 2003 のオペレーティング システムでは、Windows の [スタート] メニューで、[プログラム][管理ツール][インターネット サービス マネージャ] の順にポイントします。

    • Microsoft Windows XP Professional オペレーティング システムでは、[コントロール パネル] の [管理ツール] を開きます。

  2. サーバーのノードを開き、アプリケーションのノードが見つかるまでノードを開きます (通常は [既定の Web サイト] にあります)。

  3. アプリケーションを右クリックし、[プロパティ] をクリックします。

  4. [ディレクトリ セキュリティ] タブの [編集] をクリックします。

  5. [認証方法] ダイアログ ボックスの [匿名アクセス] チェック ボックスをオフにし、次のいずれかを実行します。

    • SQL Server が IIS と同じコンピュータ上にある場合は、[統合 Windows 認証] チェック ボックスがオンになっていることを確認します。

    • SQL Server がリモート サーバーの場合、[基本認証] がオンで、[統合 Windows 認証] がオフになっていることを確認します。

  6. すべてのダイアログ ボックスをクリックします。

アプリケーション構成ファイル (Web.config) で、IIS から提供されるユーザーの資格情報をアプリケーションが偽装するように指定します。

Web.config を設定して、IIS から渡される ID を偽装するには

  • アプリケーションの Web.config ファイルを開き、次の要素を system.web 要素に追加します。

    <identity impersonate="true"/>
    
    bsz5788z.alert_note(ja-jp,VS.90).gifメモ :

    Web.config 内の要素では、大文字と小文字が区別されます。

SQL Server にアクセスするための接続文字列を作成する場合は、統合セキュリティを使用していることを SQL Server に通知する属性を含める必要があります。

Windows 統合セキュリティ用に接続文字列を設定するには

  • SQL Server の接続文字列に、属性 Trusted_Connection=Yes を含め、ユーザー名属性とパスワード属性を削除します。

    Windows 統合セキュリティ用に設定された接続文字列の代表的な例を次に示します。

    "workstation id=WebServer1;packet size=4096;
    Trusted_Connection=Yes;data source=SQLServer01";
    persist security info=False;initial catalog=northwind"
    

アクセスしてくるユーザーを認識するように、SQL Server を設定します。

Windows 統合セキュリティ用に SQL Server を設定するには

  1. Windows の [スタート] メニューで、[Microsoft SQL Server] をポイントし、[Enterprise Manager] をクリックします。

  2. サーバーのノードを開き、ユーザーにアクセス許可を与えるデータベースのノードを展開します。

  3. [ユーザー] ノードを右クリックし、[新規データベース ユーザー] をクリックします。

  4. [データベース ユーザーのプロパティ] ダイアログ ボックスで、[ログイン名] ボックスに、domain\username の形式で入力し、[OK] をクリックします。さらに、すべてのドメイン ユーザーがデータベースにアクセスできるように SQL Server を設定します。

参照

概念

ASP.NET の偽装

Web アプリケーションから SQL Server へのアクセス

その他の技術情報

ASP.NET Web サイトのセキュリティ