Веб-сервис с базой данных: SqlException - PullRequest
0 голосов
/ 29 мая 2011

Я написал веб-сервис, который работает с базой данных SQL Server'08

Когда я пытаюсь вызвать веб-метод, я получаю следующее:

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

В чем проблема?Другое приложение Win Form, которое использует ту же БД, работает нормально, а WS - нет?

Ответы [ 3 ]

3 голосов
/ 29 мая 2011

Веб-служба будет работать под учетной записью другого пользователя, чем приложение WinForms. Приложение WinForms будет работать из учетной записи пользователя, вошедшего в систему, а веб-служба будет учетной записью, используемой ASP.NET.

Вам необходимо настроить эту учетную запись в SQL Server и дать ей соответствующие разрешения.

По сути, вам нужно добавить логин на сервере и добавить этот логин в качестве пользователя для каждой базы данных, которая ему требуется.

Вот пошаговые инструкции, когда вы находитесь в SQL Server Management Studio:

  • В обозревателе объектов откройте дерево SQL Server и перейдите в ветку Безопасность -> Логины
  • Щелкните правой кнопкой мыши «Logins» и выберите «New Login ...»
  • Далее введите логин, нажмите «Поиск»
  • Нажмите «Дополнительно», чтобы открыть диалоговое окно «Выбор пользователя или группы»
  • Нажмите «Найти сейчас»
  • Прокрутите список внизу диалогового окна, найдите соответствующего пользователя и дважды щелкните по нему. Диалог закроется.
  • Нажмите "Хорошо". Диалог закроется.
  • Вернувшись в диалоговое окно «Логин - Новый», нажмите «ОК»

Теперь у вас есть новый логин.

Теперь, чтобы создать пользователя в базе данных.

  • Откройте ветку Базы данных вашего дерева.
  • Откройте ветку для конкретной базы данных, которая вам нужна, тогда это ветка Безопасность -> Пользователи.
  • Щелкните правой кнопкой мыши «Пользователи» и выберите «Новый пользователь ...»
  • Введите имя пользователя (оно не должно совпадать с именем входа, но обычно оно совпадает)
  • Рядом с «логином» нажмите кнопку «...»
  • Нажмите «Обзор» в диалоге выбора входа
  • Проверьте желаемое имя входа в диалоговом окне «Поиск объектов».
  • Нажмите «ОК». Диалог закроется
  • Нажмите «ОК». Диалог выбора входа закроется.
  • Выберите «Схемы, принадлежащие этому пользователю» - обычно «db_owner»
  • Выберите членство в роли базы данных - обычно это будет определенная роль, созданная администратором базы данных, если нет, то db_datareader & db_datawriter. Если у вас есть проблемы, выберите db_owner, а затем поработайте с вашим администратором базы данных, чтобы впоследствии исправить разрешения (вы не хотите назначать процесс ASP.NET с разрешениями владельца БД, если только вам это действительно не нужно, это брешь в системе безопасности, ожидающая выполнения)
  • Нажмите «ОК», чтобы закрыть диалоговое окно «Пользователь базы данных».

Теперь все должно быть хорошо.

OR

Вы можете изменить строку подключения в веб-службе, чтобы она могла подключаться к SQL Server с использованием определенной учетной записи.

2 голосов
/ 29 мая 2011

Colin Mackay предоставил подробный ответ на ваш вопрос.Вот мои два цента.

Если в вашей среде настроен домен Active Directory, я бы не рекомендовал бы включать user id и password в ваше соединение.Вместо этого я бы предложил следующее:

  1. Создайте учетную запись домена, скажем MyDomain\webservice, где MyDomain будет доменом активного каталога, а 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. Создайте новый пул приложений (скажем, WebServiceAppPool), аналогичный пулу приложений ASP.NET v4.0, за исключением того, что новый пул приложений будет использовать Identity только что созданной учетной записи домена MyDomain\webserviceвместо обычного ApplicationPoolIdentity .

  6. В опции Advanced Settings виртуального каталога / сайта, на котором развернут ваш веб-сервис, измените приложение Свойство Pool для использования вновь созданного пула приложений WebServiceAppPool.

Я считаю, что эта настройка более безопасна, а также она позволит избежать жесткого кодирования идентификатора пользователя и паролей вСтрока подключения.

Надеюсь, это поможет.

0 голосов
/ 29 мая 2011

В сообщении четко сказано: Сбой входа в систему ..... пользователь (IIS APPPOOL\ASP.NET v4.0, пытающийся подключиться к базе данных, не имеет разрешений там.

Не зная ни одногодругие детали, я предполагаю, что это веб-приложение / веб-служба ASP.NET, размещенное в IIS, и у вас, скорее всего, есть строка подключения к базе данных, в которой включена настройка Integrated Security=SSPI - следовательно, текущий пользователь (здесьПользователь приложения IIS) пытается подключиться к базе данных - и не может.

Поэтому измените строку подключения (см. Множество примеров на http://www.connectionstrings.com), чтобы указать конкретного пользователя базы данных, который может подключение:

server=YourServer;database=YourDatabase;User ID=SomeValidUser;Pwd=Top$ecret
...