12

新しくデプロイした (lcoal IIS 7.5 に) MVC4 アプリにアクセスしようとすると、次のエラーが表示されます。

ユーザー 'DOMAIN\MACHINE-NAME$' のログインに失敗しました

「$」が追加され、マシン名の一部ではありません。

web.config の接続文字列は次のようになります。

<add name="ComairRIEntities"
     connectionString="metadata=res://*/Data.ComairRI.csdl|res://*/Data.ComairRI.ssdl|res://*/Data.ComairRI.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
4

9 に答える 9

10

これが起こっていることです:

接続文字列には、次の設定があります。統合セキュリティ= Trueこれは、SQL Server接続が、接続を開始するプロセス の資格情報で認証されることを意味します。IISで実行していて、IISはアプリケーションプールを使用しているため、接続はアプリケーションプールを実行しているWindowsユーザーで認証されます。デフォルトでは、これはNetworkServiceと呼ばれる権限をほとんど持たないユーザーです。NetworkService(またはIIS7.5では別のサービス)がデータベースへのアクセス権を持つことはありません。IISにはさまざまなセキュリティの継承があり、プロセスにさまざまなユーザーがいるため、特定のシナリオのニュアンスは少し異なる場合がありますが、基本的な問題は、統合セキュリティ=Trueであり、IISプロセスを実行しているユーザーは、ほとんど権限のない標準ユーザーです。

修正するには、いくつかのオプションがあります。

  1. 統合セキュリティ=Trueをusername\passwordauthenticationに変更します。これで100%解決できますが、パスワードのクリアテキストをweb.configファイルに保存したくない場合があります。
  2. IIS仮想ディレクトリ設定で、匿名ユーザーを、データベースへのアクセス権を持つ意味のあるユーザーになるように構成します。これは最終的には役立ちますが、正しく設定するにはさまざまな設定で遊ぶ必要があります。

#2についてさらにサポートが必要な場合は、次の情報を提供する必要があります。

  1. AppPoolのアイデンティティ
  2. 仮想ディレクトリのIDと仮想ディレクトリのすべての認証設定。
于 2013-03-01T06:39:01.417 に答える
3

この質問には多くの良い情報があります: Login failed for user 'DOMAIN\MACHINENAME$' .

Login failed for user 'DOMAIN\MACHINENAME$' のようなエラーが表示される場合は、NETWORK SERVICE または LocalSystem として実行されているプロセスがリモート リソースにアクセスし、マシン アカウントとして自身を認証し、承認が拒否されたことを意味します。

ここで奇妙に思えるのは、まだローカル データベースにアクセスしようとしているのに、ユーザー名 がDOMAIN\MACHINENAME$非ローカル データベースにアクセスしていることを暗示していることです。

投稿した接続文字列が実際に使用されているものであると確信していますか?

他に検討できることは、サイトが実行されているアプリケーション プール用の特定のユーザー アカウントを作成することです。おそらく、読み取りと書き込みのアクセス許可が必要です。

ユーザー アカウントの種類は環境によって異なります。ドメイン内で実行している場合は、ドメイン ユーザーを作成integrated security=Trueして接続文字列で引き続き使用できます。そうでない場合は、SQL 認証を使用して調査できます。

編集:

ほぼ同じことをして、この正確なエラーが一度発生しました。私の場合、データベースは別のサーバー上にありました(つまり、あなたの場合と同じマシンではありません)が、解決策は次のとおりです。

  1. ドメイン アカウントを作成します。
  2. これを SQL Management Studio の Security\Logins および Security\Users に追加します。
  3. SQL Management Studio でロール メンバーシップをdb_datareader提供します。db_datawriter
  4. Web サーバーで、実行します。aspnet_regiis -ga domain\account_name
  5. このアカウントを匿名アクセスに使用するアカウントに設定します。
  6. この Web アプリケーション用の新しいアプリケーション プールを作成します。
  7. アプリケーション プールの ID をこのアカウントに設定します。

これは IIS 6 の場合であるため、IIS 7 以降を使用している場合は、手順 4、5、および 6 は必要ないことに注意してください。

于 2013-02-22T09:28:05.633 に答える
2

注意すべきことの 1 つDOMAIN\MACHINE-NAME$は、ドメインでマシンの資格情報を表すために使用される構文です。ユーザー アカウントの作成方法と同様に、ほぼ同じマシン アカウントもあります (権限が大幅に異なることを除きます)。

取得しているのでDOMAIN\MACHINE-NAME$、なりすましの問題はありません。最初に行うことは、アプリケーション プールを調べて、それがどの ID として実行されているかを確認することです。

これを行うには、IIS マネージャーを開き、[アプリケーション プール] を選択します。次に、アプリケーション プールを選択し、右側の [View Applications] をクリックします。これにより、すべてが正しくセットアップされていることを確認できます。

正しく構成されている場合は、[詳細設定...] をクリックします。[プロセス モデル] ヘッダーの下に [ID] フィールドがあり、次のいずれかである必要があります。

  • ApplicationPoolIdentity
  • LocalService
  • ローカル システム
  • ネットワークサービス
  • ドメイン\アカウント

それが ApplicationPoolIdentity である場合は、期待どおりに設定されます。カスタム以外の場合は、DOMAIN\MACHINE-NAME$経験したとおりになる可能性があります。それがそのアカウントとして表示されるため、カスタム アカウントは疑わしいです。

それが ApplicationPoolIdentity であり、SQL マシンが同じマシン上にない場合 (または、ホスト名または IP アドレスを使用している可能性がある場合) DOMAIN\MACHINE-NAME$、それが ApplicationPoolIdentity のネットワーク資格情報であるため、取得される可能性があります。ApplicationPoolIdentity はIIS AppPool\ApplicationPoolローカル アクセスに使用しますがDOMAIN\MACHINE-NAME$、リモート アクセスに使用します。前者はローカルでしか使用できないためです。

また、アクセス方法が重要であることについて上で詳述した理由から、実際にその正確な接続文字列を使用していることを確認してください。

これで解決しない場合は、設定した ID と、ASP.Net の偽装が有効になっているかどうかを詳しく説明すると役立ちます。

于 2013-02-28T20:57:05.217 に答える
1

アプリ プール ID をログインとして SQL Server に追加する必要があります。これを読んでください: http://www.iis.net/learn/manage/configuring-security/application-pool-identities-and-sql-server-express

于 2013-03-01T05:21:31.950 に答える
1

IIS マネージャーで、アプリの AppPool が実行されている ID を確認します。おそらく AppPoolIdentity になります。次に、その ID の SQL Server でログインを作成したこと、それがデータベースにマップされていること、アプリケーションに必要なロール メンバーシップ/アクセス許可があることを確認します。ID 名は "IIS AppPool\[AppPoolName]" になります。(詳細については、 http://www.iis.net/learn/manage/configuring-security/application-pool-identitiesを参照してください)。

それでもうまくいかない場合は、偽装が有効になっているかどうかなど、アプリケーション データベース接続の構成方法を説明してください。

于 2013-02-25T18:49:18.663 に答える
1

このビットに " を付ける必要がありますか?

  provider connection string=&quot

文字列の残りの部分のように、単なる引用符ではないでしょうか?

文字列の最後にも 1 つあります。

于 2013-02-14T09:41:06.060 に答える
1

これは、アプリケーション プール ID が SQL Server への接続時に示すローカル ユーザー アカウントです。Network Service を使用するようにアプリケーション プールを変更して、Network Service にデータベースへのアクセス許可を与えるか、データベースにアクセス許可を与えてくださいIUSR_YOUR-MACHINE。ローカルで作業しているので、ネットワーク サービスをローカル データベースの db_owner にする方が簡単かもしれません。明らかに、本番環境でこれを行うにはセキュリティ上の問題があります!

于 2013-02-22T09:16:54.387 に答える
1

以下レビューしていきます。

"data source=(local)" の代わりに、データベースが存在するコンピューター名を使用します。DNS 解決をチェックして、名前が正しいことを確認します。

アプリケーション プールを実行しているユーザーが、データベース サーバーに接続する権限を持っていることを確認してください。

于 2013-03-01T03:41:33.203 に答える