私はWebプロジェクト(C#Asp.Net、EF 4、MS SQL 2008およびIIS 7)を持っており、ローカルでIIS 7に移行する必要があります(現時点ではうまくいきます)。カッシーニ)。
ローカルにIIS私は私の展開で私のDefault Web Site
を持っています。私のdeployもDefault Web Site
も、私のWebプロジェクトとして、Framework 4をターゲットとしたプールASP.NET v4.0(設定のイメージを見る)にあります。 サイトにアクセスすると、ブラウザはページを表示せず、代わりにブラウザにページをダウンロードさせます。
私はIIS上でローカルに実行されている他のプロジェクトを持っていて、それらは問題なく動作します(しかしそれらはEntity Frameworkを使用しません)。
イベントロガーを使用すると、以下のようなエラーが表示されます。
Exception information:
Exception type: EntityException
Exception message: The underlying provider failed on Open.
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
更新:あなたはこの質問についてのリソースを読むことができます彼の答えで巧妙に説明されるように許可が手動でMS SQL 2008で与えられなければなりません。 IIS 7.5およびMS SQL 2008 R2を使用している場合は、手動で権限を設定する必要はありません。
SQL Serverへの接続を開こうとして失敗しているようです。
IIS APPPOOL\ASP.NET v4.0
のSQL Serverへのログインを追加し、データベースへのアクセス許可を付与する必要があります。
SSMSのサーバーの下にある[セキュリティ]を展開し、[ログイン]を右クリックして[新しいログイン]を選択します。
[新しいログイン]ダイアログで、ログイン名としてアプリプールを入力して[OK]をクリックします。
その後、アプリプールのログインを右クリックし、[プロパティ]を選択して[ユーザーマッピング]を選択します。適切なデータベースと適切な役割を確認してください。私はあなたがdb_datareader
とdb_datawriter
を選ぶことができると思います、しかしあなたがEFを通してそれをするならあなたはまだあなたがストアドプロシージャを実行するために許可を与える必要があると思う。ロールの詳細を確認できます ここ 。
ApplicationPoolIdentityは、IIS 7 - >アプリケーションプール - >詳細設定から変更できます。
ApplicationPoolIdentityの下にローカルシステムがあります。これにより、アプリケーションはデフォルトでデータベースへの既存のログインであるNT AUTHORITY\SYSTEM
の下で実行されます。
編集:この提案を適用する前に、セキュリティへの影響に注意して理解する必要があります。
あなたが持っていることを確認してください...
Trusted_Connection=false;
あなたのつながりで
次の画像のようにSQLを使用してこの問題を解決しました。
「db」 - >「プロパティー」 - >「許可」 - >「サーバー許可の表示」 - >を右クリックしてから、「IIS APPPOOL\ASP.NET v4.0
」を選択して許可を付与します。
このSQLスクリプトを実行する
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser]
FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO
接続文字列 の場合は、次のように指定します。
User ID=xxx;Password=yyy
しかし、 接続文字列 には、
Trusted_Connection=true;
SQL ServerはWindows認証を使用するため、接続値は無視され、上書きされます(IISはIdentityユーザープロファイルで指定されたWindowsアカウントを使用します)。 詳細はこちら
接続文字列 の場合も同様です。
Integrated Security = true;
または
Integrated Security = SSPI;
データベースサーバーへの接続にはWindows認証が使用されるためです。 詳細はこちら
私はApplicationPoolIdentityが嫌いです。私はいつもWindowsユーザーアカウントをAppPoolsのアカウントとして設定しています。
漂流者が言うように、それはデータベースセキュリティ問題のように聞こえます。そのため、NTユーザーアカウントを作成し、それをASP.NET v4.0 AppPoolに割り当ててから、WebサイトフォルダおよびSQL内の関連テーブルに対するアクセス許可を付与します。
統合セキュリティを使用しないでください。 User Id=yourUser; pwd=yourPwd;
を使う
これで問題は解決します。
Windows認証を使用していて、接続文字列にユーザー名のパスワードが記載されていない場合は、最初に確認する必要があります。
Localhostを介してコードを実行するとどうなりますか?localhostからwcfテストクライアントを実行すると、ローカルデバッグモードのアプリケーションがアカウントのサービスによってデータベースを呼び出すので、データベースと通信できるようになります。 devenv.exeがあなたのユーザーアカウントで実行されているので、データベースにアクセスできます。
しかし、WebサービスをIISにデプロイしたとき。今すぐこのサービスがあなたのアカウントの下ではなくIISの下で動くことを理解してください。そのため、Windows認証のためにSQL Serverにアクセスするには、IIS serviceにアクセス権を割り当てる必要があります。アクセス権の問題とuser_______のログイン失敗のため、ここではあなたのWebサービスはSQLサーバーと通信できません(ここであなたのユーザーが来ます)
データベースへの接続にWindows認証を使用している場合は、IISアプリケーションプールの設定を変更するだけで済みます。 IISアプリケーションプールのIDをローカルシステムに変更する必要があります。
Windows認証WCFの手順は次のとおりです。•IIS(windows + R(run)を入力し、inetmgrと入力して[OK]をクリックします) (DefaultAppPool)•次に、右側のアクションの下で、[詳細設定]をクリックします。•[プロセスモデル]セクションに移動し、[ID]をクリックします。 •今すぐLocalSystemを選択します。
今すぐあなたのSQL Server Management Studioを開きます:run - >を開いてssmsと入力し、ssmsでOKを押し、あなたのwindows認証アカウントを使ってログインします。 [セキュリティ]タブを開いて[ログイン]タブを展開すると、アカウントを表示できます。
アカウントのプロパティを開くには、userMappingに移動し、接続するデータベースを選択してから、選択したデータベースに使用する役割メンバーシップサービスを確認し、[OK]をクリックします。 (ネットワークサービス、つまりイントラネットユーザーの場合は、NT AUTHORITY\SYSTEMユーザーにも上記の設定を構成する必要があります)
trusted_Connection = Trueを追加します。接続文字列のプロパティ。保存してWebサービスをデプロイします。アプリプールを再起動します。
これでデータベースに接続できるようになります。
このメッセージが表示され、WebサーバーでWindows認証を使用しています。
App Poolで指定されたIIS APPPOOL\ASP.NET v4ユーザーを使用するのではなく、現在認証されているWebユーザーをデータベースに対して認証する必要がありました。
私はweb.configに次のように入力して見つけましたが、これは私のために修正されました:
<system.web>
<identity impersonate="true" />
</system.web>
https://msdn.Microsoft.com/ja-jp/library/bsz5788z.aspx
SQL DBでAppPoolユーザー名を作成する方法、または単にSQL認証を使用する方法に関する他の回答があります。 SQL内で個々のWindowsユーザーを捕獲したり保護したりしたくない場合は、どちらも正しいでしょう。
トム
私はこの問題を抱えていて、実際には別の原因が原因でした - 私のデータベースには 'IIS APPPOOL\ASP.NET v4.0'ユーザーがいましたが、それでもまだ機能していませんでした。
私は最近SQL Serverのインストールをアップグレードし、その過程でユーザーがログインから切断されていた - だからデータベース - >セキュリティ - >ユーザーの下に 'IIS APPPOOL\ASP.NET v4.0'がありました。 - >ログイン.
セキュリティ - >ログインにログイン 'IIS APPPOOL\ASP.NET v4.0'を追加しました。SQLServerは自動的にそれをデータベース内のユーザーにマッピングし(これは手動で行わなければならなかった)問題は解決されました。
指摘したように、 Windows認証を使用しない、SQL Server認証を使用する
また、[サーバー接続]ダイアログを使用して接続を作成した場合は、必ずweb.configで接続を確認してください。接続を作成または変更し、それが信頼できる接続としてweb.configに保存された可能性があります。単にこの認証を使う
<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=Finantial;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>
これはエラーを修正するはずです。
アイデンティティを設定することは私のページでこれを機能させるだけです。
Web.configに接続文字列が追加されている場合は、「Integrated Security = false;」と入力してください。そのため、web.configで指定されたIDとパスワードが使用されます。
<connectionStrings>
<add providerName="System.Data.SqlClient" name="MyDbContext" connectionString="Data Source=localhost,1433;Initial Catalog=MyDatabase;user id=MyUserName;Password=MyPassword;Trusted_Connection=true;Integrated Security=false;" />
</connectionStrings>
Cassiniは、Visual Studioアプリケーションを起動したときに、Webサイトを自分のユーザーIDとして実行します。 IISはあなたのウェブサイトをApp Pool Identityとして運営します。アプリケーションプールIDにデータベースへのアクセス権が付与されていないと、エラーが発生します。
IISは、セキュリティを向上させるためにApp Pool Identityを導入しました。デフォルトのApp Pool IDでWebサイトを実行することも、独自の名前で新しいApp Poolを作成することも、ユーザーアカウント(通常はドメインアカウント)で実行される独自の名前で新しいApp Poolを作成することもできます。
Azure以外のネットワーク環境では、新しいApp PoolをActive Directoryドメインのユーザーアカウントで実行することができます。私はマシンアカウントよりもこれを好む。そうすることで、データベースを含むネットワークリソースへのきめ細かいセキュリティときめ細かいアクセスが可能になります。各Webサイトは異なるApp Pool上で実行されます(そしてそれらの各Webサイトはそれぞれ独自のDomain Userアカウントで実行されます)。
すべての接続文字列でWindows統合セキュリティを引き続き使用します。 SQL Serverで、ドメインユーザーをログインとして追加し、Webサイトごとにデータベース、テーブル、SPなどへのアクセス許可を付与します。例えば。 Website1はApp1プールでUser1として実行されているため、Website1によって使用されるDB1はUser1のログインを持ちます。
Visual Studio内蔵DB(例えばLocalDB)および内蔵Webサーバから本番環境への配備に関する1つの課題は、開発者のユーザSIDおよびそのACLが安全な本番環境では使用されないという事実から生じる。マイクロソフトは展開用のツールを提供しています。しかし、localDBとlocalWebServerを使用した新しい簡単なVS IDEでは、箱から出してすぐに作業できることすべてに慣れている貧しい開発者は残念です。これらのツールは、特にそのような開発者にとって使いにくいでしょう。 SysAdminとDBAdminのサポートまたはそれらの専門知識が不足しています。それにもかかわらず、Azureへのデプロイは上記のエンタープライズネットワークの状況よりも簡単です。
私はそれが質問に関連しており、場合によってはそれに答えることができるので答えとしてこれを投稿すると思いました。
同じメッセージが表示されます/ データベースが存在しない場合
接続文字列につづりの間違いがないこと、正しいサーバーインスタンスを指していることなどを確認してください。
私は@JeffOgataが言ったように正確にしました、しかし私はエラーを得ました:
Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401)
私は自分のエラーメッセージをもう一度見て、それがLogin failed for user 'IIS APPPOOL\DefaultAppPool'.
と言った
IIS APPPOOL\DefaultAppPool
という名前のユーザーを追加した後、すべてうまくいきました。
私はSQL Server Profiler(SSMS => Toolsメニューで利用可能)を使用し、そこで(IISがデータベースに接続しようとしたときに)私のIISユーザーが何らかの理由でNT NTであることを見ました、この質問の回答で推奨されているすべての手順に関係なく。だから私はSQL Serverにそのユーザーを追加し、それがうまくいった...
Integrated Security=True
を false に変更して解決したのと同じ問題があります
SSMSのアップデート後に作成される特定のデータベースでこの問題に直面する可能性があります。 SSMSを開き、データベースを選択して必要なデータベースを開き、セキュリティ - >ユーザー - >をクリックしてユーザーを右クリックし、もう一度 '新規ユーザー'をクリックします _を追加して'NT AUTHORITY\Authenticated Users '作業内容を保存し、Web /デスクトップ上のフォームに移動します。楽しい....
私はASP.NET Web APIのテストと同じ問題に遭遇しました
Visual Studio 2013 Expressで開発されたWeb.Host SQL Server 2012 Expressで作成されたデータベース内蔵IIS Expressを使用してテストを実行(作業用)IIS Localを使用するように変更)Fiddler Received error - 'APPPOOL\DefaultAppPool'を引用しているプロバイダのデータベースを開けませんでした。
うまくいった解決策。
IISで
アプリケーションプールをクリックします。 'DefaultAppPool' Set Identify = 'ApplicationPoolIdentity' Set .NET framework = v4.0(私のアプリが4.5であっても)
SQL Server Management Studioで
[セキュリティ]フォルダを右クリックします(SQL Serverエンジンの下にあるため、すべてのテーブルに適用されます)[ユーザー]を右クリックし、[IIS APPPOOL\DefaultAppPool]を追加します。あなたがDBAであるならば、上記に関してあなたはおそらくあなたが知っていてそしてそれらのオプションが何であるかを制御したいです。あなたが私のような開発者であれば、MVCスタイルでEF 6を介してSQL Serverにアクセスすることも起こるあなたのWEB APIサービスをテストしたいだけでした。それからすべてをチェックしてください。 :)はい、わかっていますが、うまくいきました。
あなたは@Teddy
が推奨することをしましたか、そしてあなたは _まだ_ 同じエラーを得ますか?
親サーバーではなく、仮想ディレクトリに対応するアプリプールの設定を変更していることを確認してください。各仮想ディレクトリには独自のAppPoolがあり、継承しません。
新しいログインを追加する場合は、サーバーのプロパティ(rightclick - > properties)/ securityで、認証モードがウィンドウだけでなくsqlserverとウィンドウの両方に設定されていることを確認してください。
重要サーバーロールで 'sysadmin'を有効にします。
セキュリティ下で "Everyone"を追加します。サーバーとデータベースにログインしているユーザーを追加した場合、これはあなたが欠けているものです。お役に立てれば。
同じようなことが私のために起こったのは私のために働いていたウェブサイトのweb.configでプロパティIntegrated Security = TrueをIntegrated Security = falseに変更することでした
DefaultAppPoolで、Sql Serverで、IdentityプロパティにNetworkServiceを設定し、ユーザーネットワークサービスを追加して、データベースに適切なアクセス許可を付与します。これは、私にとっては非常にうまく機能します。ネットワーク内の他のコンピュータIISのIdentityにLocalSystemを設定するとうまくいくので、Sql Serverに他のユーザーを作成する必要はありませんが、ネットワーク環境ではうまくいかないと思います。
Asp.net Webフォームでは、
このエラーは、asp.netを次の場所からインストールするときに修正されました。
「サーバーマネージャー」>「管理」>「役割と機能の追加」>「サーバーの役割」>「Webサーバー(IIS)」>「Webサーバー」>「アプリケーション開発」>「ASP.NET 3.5/4.6」がインストールされている。
私の問題は解決しました。
LocalDB
からSQLEXPRESS
に切り替えた後でこのエラーに遭遇した場合は、データベースがすでにSQLEXPRESS
に存在していることを確認してください。これはManagement Studioで確認できます。
Entity Framework
に切り替えた後にSQLEXPRESS from LocalDB
を使用したときも同じ問題がありました。 Update-Database
コマンドを実行しなければなりませんでした。その後うまく接続できました。