ASP.NET v3.5 WebアプリケーションがSQL Server 2008データベースへの接続を開こうとすると、次の例外がスローされます。
System.Data.SqlClient.SqlException:ログインによって要求されたデータベース「MyDbName」を開けません。ログインに失敗しました。ユーザー「NT AUTHORITY\IUSR」のログインに失敗しました。
問題は、サーバーのログインリストとデータベースのユーザーリストにNT AUTHORITY\IUSR
を追加したことです。サーバーの場合はユーザーにパブリックロールを付与し、データベースの場合はdb_datareader
権限を付与しました。
アプリケーションプールが実行されているIDであるNT AUTHORITY\NETWORK SERVICE
にも同じことを許可しました。
Webアプリケーションは、IIS7によってホストされます(違いがある場合)。 DBとIISが同じ物理マシン上にある場合も同様です。
ここでのトリックは、NT AUTHORITY\NETWORK SERVICE
が実際にはデータベースにDOMAINNAME\MACHINENAME$
として表示されることです($
記号に注意してください!)。つまり、WebサーバーからSQL Serverにマシンの境界を越えるときに、NETWORK SERVICE
またはLOCAL SYSTEM
アカウントを使用すると、SQL Serverはマシンアカウントを認識します。他の非ドメインアカウントを使用すると、SQL Serverは資格情報を受け取りません。
エラーメッセージに少し戸惑いました。正直なところ、DBが別のボックスにあるときにLogin Failed for NT AUTHORITY\ANONYMOUS LOGON
以外のものが表示されるとは思いません。
IUSR
は匿名のWebサイトに使用され、SQL Serverにネットワーク経由で渡すことはできません。同じマシンですべてを実行している場合は、それが機能する方法を見つけることができるかもしれませんが、私はそのように実行することはないので、私にはわかりません... ;-)
web.configでそれが誰かを助ける場合、このエラーが消えるように<identity impersonate="false" />
を追加しました(<system.web>
の下)
別の(できればドメイン)アカウントを作成し、接続文字列(通常はweb.config)で指定することをお勧めします。その後、このアカウントで実行できることとできないことをWebサーバーのアクセス許可に制限できます。次に、SQLサーバーでこのアカウントに必要な権限を付与できます。
偽装を許可するようにIISが構成されていないが、web.configが偽装を試行している場合は、前と同じようにこのエラーが発生することに注意することが重要です。 。
私はこの正確なエラーに遭遇したばかりで、次のすべての手順が必要です(ただし、最初の手順がありませんでした:
2.)偽装を使用するようにサイトを構成する(web.config)と組み合わせる:
<system.web>
<identity impersonate="true" userName="your_service_acct" password="***" />
3.)上記の手順では、MSSQLに 'your_service_acct'のSQLログイン設定があり、権限が付与されていることを前提としています。
Localhost、localdb、または個人的にアクセス権を持つリモートdbで実行すると、開発IISはまるでYOUであるかのように実行され、すべてが魔法のように機能します。したがって、デバッグではモードでは、特別なweb.config。を作成する必要はありません。
IISは次のことを試みますので、サイトをある種のサーバー(私の場合、私たちのTEST環境)に展開するとすぐに、上記の手順を実行した必要があるでしょう。アプリケーションプールユーザーとして接続します。これは通常、管理上必要なことではありません。つまり、 web.config変換 の使用を開始するときに、Visual Studioは適切なidentity impersonate="true"
を挿入します「パブリッシュ...」のデプロイメントステップ中。
私は同じ問題を抱えていましたが、アプリケーションプールを変更することでこれを解決しました。
接続文字列でIntegrated Security=True;
を使用する代わりに、ユーザー名とパスワードによる認証user=sa; pwd=mypassword;
を使用するだけです
この問題は、最後のデータベースに新しいデータベースを復元するときに表示されます。
これを解決するには、sqlserverに移動し、次にセキュリティに移動して、アプリケーションプールを再度設定する必要があります。