ASP.NET で MSSQL に Windows 認証で接続

ASP.NET でローカルホストのSQL Server 2008 Express に 接続する際には Windows 認証を利用することができます。Windows 認証を利用するメリットとしては Web.config にパスワードを記述する必要がなくなるという点があります。

Windows Vista sp2 及び Windows 7 で Windows 認証を利用する時には、アプリケーションプールのデフォルトの動作アカウントが変更になっているため、SQL Server の権限設定をするアカウントに注意してください。従前、アプリケーションプールはデフォルトでは、 NETWORK SERVICE のアカウントで動作していましたが、Vista sp2 以降、セキュリティの向上のため、アプリケーションプール固有(Application Pool Identity)のアカウントが使用されるようになりました。アプリケーションプールと同じ名前のアカウントが生成されて、そのアカウントを使用してアプリケーションプールのワーカープロセスが動作します。たとえば、デフォルトのアプリケーションプールである DefaultAppPool の場合は、DefaultAppPool というアカウントでワーカープロセスが動作します。

ASP.NET アプリケーションで Windows 認証を使用して、SQL Server 2008 Express のデータベースにログインをしたい場合は、IIS AppPool\アプリケーションプールの名前 (DefaultAppPool の場合 IIS AppPool\DefaultAppPool)というログインユーザーをデータベースエンジンに追加し、作成したデータベースに db_owner の権限を付与するようにします。なお、Application Pool Identity は Users グループに属するので、BUILTIN\Users に db_owner の権限を付与することで簡単に設定することができますが、任意のアプリケーションプールから接続できるようになるのでセキュリティ面は弱くなります。また、IIS_IUSRS グループについては、ログインとして登録できません。

以下は、mojoportal というデータベースに、DefaultAppPool のアカウントに権限を設定する具体的な手順のメモです。

1.SQL Server Management Studio Express(SSMS)を起動して、データベースエンジンに接続します。オブジェクトエクスプローラで、[セキュリティ]の[ログイン]を選択して右クリックして[新しいログイン(N)...]を選択します。すると次のようにログインの新規作成の入力画面が表示されます。「ログイン名」の項目に、IIS AppPool\DefaultAppPool と入力します。「ログイン名」を入力する場合、検索ボタンから検索して設定をすることが多いとおもいますが、「IIS AppPool\アプリケーションプールの名前」のユーザーアカウントは検索をしても出てきません。直接入力をする必要があります。
sql01

2.[ページの選択]でユーザーマッピングを選択し、[このログインにマップされたユーザー]で、作成したデータベース(ここではmojoPortal)を選択て、[mojoPortal のデータベースロールメンバーシップ]でdbo_owner にチェックします。それから、「OK」ボタンをクリックします。
sql02

ここまで設定できると、ASP.NET からSQL Server 2008 Express の データベースに dbo_owner の権限でアクセスできるようになります。

参考にしたページ
Application Pool Identities

Windows 認証の場合の接続文字列

.NET Framework Data Provider for SQL Serve(providerName="System.Data.SqlClient")の場合の接続文字列は、以下のようになります。

・名前付きインスタンス(インスタンス名 SQEXPRESS)の場合

Server=.\SQLEXPRESS;Database=databasename;Integrated Security=True;
(別の表記)
Data Source=localhost\SQLEXPRESS;Initial Catalog=databasename;Integrated Security=SSPI;

・既定のインスタンスの場合

Server=.;Database=databasename;Integrated Security=True;
(別の表記)
Data Source=localhost;Initial Catalog=databasename;Integrated Security=SSPI;