0

SQL Server'08 データベースで動作する Web サービスを作成しました

Web メソッドを呼び出そうとすると、次のようになります。

System.Data.SqlClient.SqlException: Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   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.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at route.Logic..ctor() in C:\Users\Ilya\Documents\Visual Studio 2010\Projects\MobitourLibrary\route\Logic.cs:line 20
   at Service..ctor() in c:\inetpub\wwwroot\RouteGen\App_Code\Service.cs:line 14

問題はどこだ?同じ DB を使用する他の win フォーム アプリケーションは正常に動作しますが、なぜ WS は動作しないのですか?

4

3 に答える 3

3

Web サービスは、WinForms アプリケーションとは別のユーザー アカウントで動作します。WinForms アプリケーションはログインしているユーザーのユーザー アカウントから動作しますが、Web サービスは ASP.NET が使用するアカウントになります。

そのアカウントを SQL Server で設定し、関連する権限を付与する必要があります。

基本的に、ログインをサーバーに追加し、そのログインを必要とする各データベースにユーザーとして追加する必要があります。

SQL Server Management Studio を使用している場合の詳細な手順は次のとおりです。

  • オブジェクト エクスプローラーで、SQL Server ツリーを開き、[セキュリティ] --> [ログイン] ブランチに移動します。
  • [ログイン] を右クリックし、[新しいログイン...] を選択します。
  • ログイン名の横にある「検索」をクリック
  • [詳細設定] をクリックして、[ユーザーまたはグループの選択] ダイアログを表示します。
  • 「今すぐ検索」をクリック
  • ダイアログの下部にあるリストをスクロールし、関連するユーザーを見つけてダブルクリックします。ダイアログが閉じます。
  • 「OK」を押します。ダイアログが閉じます。
  • 「ログイン - 新規」ダイアログに戻り、「OK」を押します

これで、新しいログインができました。

次に、データベースにユーザーを作成します。

  • ツリーのデータベース ブランチを開きます。
  • 必要な特定のデータベースのブランチを開きます。次に、それは Security-->Users ブランチです。
  • [ユーザー] を右クリックし、[新しいユーザー...] を選択します。
  • ユーザー名を書きます (ログイン名と一致する必要はありませんが、通常は一致します)
  • 「ログイン名」の横にある「...」ボタンを押します
  • [ログインの選択] ダイアログで [参照] を押します。
  • [オブジェクトの参照] ダイアログで、必要なログイン名を確認します。
  • 「OK」を押します。ダイアログが閉じます
  • 「OK」を押します。[ログインの選択] ダイアログが閉じます。
  • 「このユーザーが所有するスキーマ」を選択します - 通常は「db_owner」
  • データベース ロール メンバーシップを選択します。通常は、DBA によって作成された特定のロールになります。そうでない場合は、db_datareader & db_datawriter です。問題がある場合は、db_owner を選択し、DBA と協力して後でアクセス許可を修正します (本当に必要でない限り、ASP.NET プロセスに DB 所有者のアクセス許可を割り当てたくありません。これは、発生するのを待っているセキュリティ違反です)。
  • [OK] を押して、[データベース ユーザーの新規作成] ダイアログを閉じます。

今はすべてうまくいっているはずです。

また

Web サービスの接続文字列を変更して、特定のアカウントを使用して SQL Server に接続することができます。

于 2011-05-29T11:33:10.790 に答える
2

Colin Mackayあなたの質問に詳細な回答を提供しました。これが私の2セントです。

環境に Active Directory ドメインが設定されている場合、接続にとを含めることはお勧め しません。代わりに、次のことをお勧めします。user idpassword

  1. たとえば、ドメイン アカウントを作成しますMyDomain\webservice。ここで、MyDomainは Active Directory ドメインであり、webserviceはそのドメインの Windows ユーザー アカウントです。で、このSQL新しいドメイン アカウント ユーザーに、データベースにアクセスするための適切な権限を付与します。

  2. で、このInternet Information Services (IIS) Managerサービス アカウントで実行されるようにアプリケーション プールを変更します。IIS 7.5 を実行している場合は、次の手順を実行してそれを行うことができます。

  3. で、ノードをIIS展開してをクリックします。<server name>Application Pools

  4. Application Poolアプリケーション プールを使用する可能性のある他のアプリケーションの機能を妨害しないように、新しい を作成することをお勧めしますASP.NET v4.0

  5. WebServiceAppPoolASP.NET v4.0 アプリケーション プールと同様の新しいアプリケーション プール (たとえば ) を作成しますが、新しいアプリケーションプールは、通常のApplicationPoolIdentityではなく、新しく作成されたドメイン アカウントのIDを使用する点が異なります。MyDomain\webservice

  6. Advanced SettingsWeb サービスがデプロイされる仮想ディレクトリ/サイトのオプションで、新しく作成されたアプリケーション プールを使用するように[アプリケーション プールWebServiceAppPool] プロパティを変更します。

このセットアップはより安全であり、接続文字列でユーザー ID とパスワードをハードコーディングすることも回避できると思います。

それが役立つことを願っています。

于 2011-05-29T12:45:17.007 に答える
0

メッセージには、次のように明確に記載れていますIIS APPPOOL\ASP.NET v4.0

他の詳細はわかりませんが、これは IIS でホストされている ASP.NET Web アプリケーション/Web サービスであると想定しています。おそらく、Integrated Security=SSPI設定がオンになっているデータベースへの接続文字列があるため、現在のユーザー (ここではIIS apppool ユーザー) がデータベースに接続しようとしましたが、接続できませんでした。

したがって、接続文字列を変更して ( http://www.connectionstrings.comの多くのサンプルを参照)、接続できる特定のデータベース ユーザーを指定します。

server=YourServer;database=YourDatabase;User ID=SomeValidUser;Pwd=Top$ecret
于 2011-05-29T11:33:17.683 に答える