web-dev-qa-db-ja.com

ASP.NETアプリケーションでのSQLServer 2008ログインの問題:明示的に指定されたデータベースを開くことができませんでした

サーバーにアクセスする必要があるASP.NETアプリケーションを使用してWindowsServer2008でSQLServer 2008 ExpressEditionを実行しています。 ASP.NETアプリケーションは、NetworkServiceアカウントで実行されるアプリケーションプールに関連付けられています。このアカウントには、必要なデータベースのSQLServerにログインレコードとユーザーレコードがあります。 ASP.NET Webサイトを実行しようとすると、空白のページが表示され、エラーログを表示すると、次の情報イベントレコードが表示されているようです。

ユーザー「NTAUTHORITY\NETWORKSERVICE」のログインに失敗しました。理由:明示的に指定されたデータベースを開くことができませんでした。 [クライアント:myLocalMachine]

接続文字列にはTrusted_Connection=True;必要なデータベースが指定されています。

ユーザー名とパスワードを明示的に指定すると、SQL Server Management Studioで同じun/pwの組み合わせが機能しても、パスワードが正しくないという別のログインエラーが表示されます。 NETWORK SERVICEアカウントには、データベースに必要なすべての権限があるようです。また、そのデータベース内のテーブルから単純な選択を行うテストASP.NET Webサイトプロジェクトを作成しましたが、同じ構成ファイルを使用してもエラーは発生せず、機能しているようです。

元のASP.NETWebアプリはオープンソースライブラリを含むさまざまなDLLを参照しているため、信頼レベルと関係がありますか。また、machine.configを含む構成ファイル内のすべてがアプリが完全に信頼されていると述べている場合でも、アプリケーションはイベントログ自体に書き込むことができないようで、セキュリティ例外をスローします。

4
eulerfx

SQL Serverの問題のセキュリティアカウントの場合、「デフォルトデータベース」は適切なデータベースに設定されていますか、それともデフォルトの「マスター」データベースとしてリストされていますか?o

1
SQL3D

データベースインスタンスがWebアプリケーションとは異なるサーバー上にある場合は、DOMAIN\WEBSERVER $のSQLログインを追加して、適切なデータベースへのアクセスを許可する必要があります。

1

頭から離れて、web.configファイル内のが信頼レベルの問題である可能性がありますか?また、SQL ServerはWindows認証モードですか、それとも混合認証モードですか? SQLServerはTCP/IP用に構成されていますか? SQL Server 2008では、TCP/IPが無効になっており、デフォルトで共有メモリまたは名前付きパイプを使用していると思います。

1
osij2is

私はこのエラーを1時間以上追跡しました。 SQL Serverの構成、ネットワークサービスユーザーの追加など、さまざまなことを試しました。

接続文字列で指定されたデータベースが、ユーザーに権限を付与したデータベースと一致することを確認する必要があります。

しかし、結局のところ、接続文字列のデータベースにタイプミスがありました。つまり、lとiが転置されていたため、使用していた解像度では検出が困難でした。

したがって、ここでの提案は次のとおりです。接続文字列をテストできる別のアプリケーションを見つけ、そして接続文字列をテストする.

1
Bruce Chapman

ローカルコンピューターに設定してIISアプリに匿名ユーザーとして配置した明示的なアカウントを使用してテストします。これにより、SSMSまたはVSからテストして、次のことを確認できます。問題なくサーバーとデータベースに接続できます。

それが機能するようになったら、または機能しない場合は、ASP側で失敗する可能性がある場所をデバッグできます。SQL側は単純ですが、ネットワークサービスアカウントを試していません。それが機能しない理由はありませんが、誰もそれを使用しているのを見たことがありません。

1
Steve Jones

答えではありませんが、回避策である可能性があります。WebアプリケーションからSQL Serverに接続するときは、統合されていないSQL認証を常に使用します。また、データの読み取りと書き込みに異なるSQLログインを使用します。つまり、ページでデータを書き込む必要がある場合は、書き込みアクセス権を持つアカウントを使用し、他のすべてのページでは、読み取りアクセス権のみを持つアカウントを使用します。これは私にはより安全に思えます。また、アプリごとに異なるログインを使用できるため、データベースを使用しているアプリを追跡できます。

JR

0
John Rennie