Подтвердить что ты не робот

Ошибка разрешения пользователя при доступе к базе данных "пользовательский экземпляр" из ASP.NET

Недавно был перенесен сервер, на котором размещен csharpindepth.com.

Большая часть работы работает нормально, но я не могу получить базу данных, используемую для хранения ошибок, заметок и т.д.

Релевантные детали:

  • 32-разрядная версия Windows Server 2003
  • Установлен SQL Server Express 2005
  • Пул ASP.NET работает под учетной записью "NETWORK SERVICE"
  • .NET 3.5
  • У всех есть полное разрешение на файлы базы данных (на данный момент, чтобы это исключить!)
  • Строка подключения:

    Data Source=.;AttachDbFilename=|DataDirectory|\WebSiteData.mdf;
    Integrated Security=True;User Instance=True
    
  • Я подключаюсь, создавая новый WebSiteDataContext (у которого указанная выше строка подключения по умолчанию)

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

В ASP.NET я получаю это исключение:

SqlException (0x80131904): User does not have permission to perform this action.

EDIT: дополнительная информация, здесь трассировка стека:

[SqlException (0x80131904): User does not have permission to perform this action.]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844759
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
   System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +35
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +144
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +342
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +221
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +189
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +4859187
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +31
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +433
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +66
   System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +499
   System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +65
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
   System.Data.SqlClient.SqlConnection.Open() +122
   System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) +44
   System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() +45
   System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() +20
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +57
   System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +35

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

ProcMon никогда не показывает его касание файла...

EDIT: дальнейшие странности - перезапуск пула приложений с его запуском под учетной записью Local System все еще имеет проблемы, что примерно так же странно, как и получается! Это, как будто, несмотря на сообщение об ошибке, он фактически пытается сделать что-то невозможное (например, с неправильным путем), а не просто проблему с разрешениями.

EDIT: дополнительная информация. Я только что запустил мое маленькое тестовое консольное приложение из службы как "NETWORK SERVICE" и (после первой попытки, которая была отключена) была успешной. Так что это не вопрос прав с точки зрения учетной записи пользователя... это что-то о среде, в которой она работает...

4b9b3361

Ответ 1

Создается ли дочерний экземпляр? Когда запрашивается база данных RANU, главный экземпляр (.\SQLEXPRESS в этом случае) должен создать экземпляр "child", другими словами, запустить процесс sqlservr.exe как пользовательский процесс, выполняющийся под учетными данными пользователя, который запросил RANU соединение с экземпляром .SQLEXPRESS. В этом случае экземпляр должен быть запущен как "СЕТЕВАЯ СЛУЖБА".

Чтобы проверить, запущен ли дочерний экземпляр, подключитесь к главному экземпляру (.\SQLEXPRESS) и проверьте sys.dm_os_child_instances:

SELECT * 
FROM sys.dm_os_child_instances

Если запущен дочерний экземпляр NETWORK SERVICE, возьмите его instance_pipe_name и подключитесь прямо к дочернему экземпляру:

sqlcmd -S np:\\.\pipe\<child pipe name>\tsql\query

В идеале, подключитесь к службе NETWORK SERVICE (например, с интерактивной консоли cmd, запущенной как NEWTORK SERVICE, возможно, используя at.exe, чтобы запланировать ее 1 минуту в будущем). Если это работает, последний шаг - попытаться подключить MDF с помощью ordinarry sp_attach_db.

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

Ответ 2

Этот вопрос связан с: "Невозможно открыть базу данных по умолчанию пользователя. Ошибка входа." после установки SQL Server Management Studio Express

По-видимому, у экземпляра пользователя и SQL Server Express есть интересные проблемы. Вы можете взглянуть на http://blogs.msdn.com/b/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx. Это похоже на трюк для большинства, у кого есть эта проблема.

Ответ 3

Вы сделали это?

Настройка SQL Server для Windows интегрированная безопасность

В меню "Пуск" Windows выберите Microsoft SQL Server, а затем выберите Enterprise Manager.

Откройте node для сервера и разверните node для базы данных, которую вы хотите предоставить пользователям права доступа.

Щелкните правой кнопкой мыши Пользователи node и выберите Новый пользователь базы данных.

В диалоговом окне "Свойства пользователя базы данных" введите домен\имя пользователя в поле Введите имя пользователя и нажмите кнопку ОК. Кроме того, настройте SQL Server разрешить доступ всем пользователям домена базы данных.

Источник

В основном убедитесь, что у вас есть "NT AUTHORITY\NETWORK SERVICE".

Также в SQL 2008, по крайней мере, не уверен, что в 2005 году вы также установили его на уровне сервера (Server → Security → Logins).

Ответ 4

Интегрированная безопасность = True

Является ли пользователь входа в базу данных подключен к учетным записям пользователей на компьютере? Может ли быть что-то связанное с отображением?

Ответ 5

Если вы используете пользовательский инстанс, вы все равно подключаетесь в качестве администратора, что, кстати, почему не рекомендуется для сценариев размещения. Проблемы с perms, которые я, как правило, получаю, являются физическими на самих файлах, а не на папках. Отрыв базы данных имеет тенденцию к полосе пропускания.

Это может помочь, если вы можете сузить место, где происходит исключение. Какое действие он пытается выполнить? База данных открыта, прочитана, написана? Также попробуйте другую базу данных (т.е. Именно эту конкретную базу данных) и попробуйте версию, не являющуюся пользователем; прикрепите базу данных к экземпляру.

Ответ 6

Первое, что я хотел бы сделать, это отключить файлmon (или лучше Process Monitor), чтобы узнать, сможет ли процесс IIS открыть файл базы данных - мне кажется, что проблема с безопасностью.

Также: убедитесь, что папка ~/App_Data не доступна только для чтения. Кроме того, проверьте, предоставили ли вы полные разрешения учетной записи "Сетевая служба" для одной и той же папки.

Возможно, вы захотите запустить IISRESET, чтобы перезапустить IIS и обновить его разрешения.

Ответ 7

Когда вы говорите, что у пользователей есть полные права доступа к файлу, все ли пользователи имеют полные разрешения в каталоге app_data? Sql необходимо будет создать файл блокировки вдоль файла MDF.

Также вы уверены, что экземпляр SQL Express имеет пользовательские экземпляры?

Ответ 8

Вы пытались запустить aspnet_regsql.exe на сервере, чтобы потенциально оттолкнуть что-то на место (вроде как как запустить aspnet_regiis один раз в голубой луне)? Скотт Гу имеет базовый обзор всего процесса, найденного здесь.

Ответ 9

Поскольку у вас есть Trusted Authentication = True, соединение использует контекст безопасности вызывающего процесса. Это означает, что вы запускаете сервер разработки в контексте безопасности зарегистрированного пользователя, поэтому все работает отлично. Когда вы запускаете в IIS, вы находитесь в контексте безопасности процесса пула приложений, который является NETWORK SERVICE, у которого нет профиля пользователя, поэтому он сбой.

Чтобы исправить, используйте решение # 1 или # 2.

1.) Измените личность пула приложений на обычного пользователя с доступом к базе данных в качестве пользовательской учетной записи. СОВЕТ: установите этого пользователя: SELECT owning_principal_name FROM sys.dm_os_child_instances WHERE heart_beat = 'alive'

2.) Используйте строку подключения с именем пользователя и паролем; что означает использование аутентификации SQL Server, а не доверенная аутентификация = True.