Ошибка разрешения пользователя при доступе к базе данных «экземпляр пользователя» из ASP.NET - PullRequest
26 голосов
/ 16 июля 2009

Сервер, на котором размещен 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

РЕДАКТИРОВАТЬ: я был не прав по поводу того, что имя файла должно быть правильным - изменение строки подключения, чтобы заставить его общаться с другим файлом не не изменит ошибку.

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

РЕДАКТИРОВАТЬ: Дальнейшие странности - перезапуск пула приложений с его запуском под учетной записью Local System все еще имеет проблемы, что примерно так же странно, как и получается! Как будто, несмотря на сообщение об ошибке, он на самом деле пытается сделать что-то невозможное (например, с неверным путем), а не просто является проблемой с разрешениями.

РЕДАКТИРОВАТЬ: Больше информации - я только что запустил свое маленькое приложение для тестирования консоли из службы под названием «СЕТЕВАЯ СЛУЖБА» и (после первоначальной попытки, которая истекла по времени), она прошла успешно. Так что это не вопрос прав доступа с точки зрения учетной записи пользователя ... это что-то о среде, в которой он работает ...

Ответы [ 9 ]

6 голосов
/ 16 июля 2009

Дочерний экземпляр вообще запускается? Когда запрашивается база данных RANU, главный экземпляр (в данном случае. \ SQLEXPRESS) должен создать «дочерний» экземпляр, другими словами запустить процесс sqlservr.exe как пользовательский процесс, работающий под учетными данными пользователя, который запросил RANU соединение из экземпляра .SQLEXPRESS. В этом случае экземпляр должен быть запущен как «NETWORK SERVICE».

Чтобы проверить, запущен ли дочерний экземпляр, подключитесь к главному экземпляру (. \ 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.

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

3 голосов
/ 22 декабря 2011

Похоже, что этот вопрос относится к: "Невозможно открыть базу данных пользователя по умолчанию. Ошибка входа." после установки 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. Это, похоже, поможет большинству, у кого есть эта проблема.

2 голосов
/ 16 июля 2009

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

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

2 голосов
/ 16 июля 2009

Ты это сделал?

Чтобы настроить SQL Server для Windows комплексная безопасность

В меню Пуск Windows выберите Microsoft SQL Server, а затем выберите Менеджер предприятия.

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

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

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

Источник

Итак, в основном убедитесь, что у вас в списке есть «NT AUTHORITY \ NETWORK SERVICE».

Также в SQL 2008, по крайней мере, не уверен, что в 2005 году вы бы также установили его на уровне сервера (Сервер -> Безопасность -> Логины).

1 голос
/ 16 июля 2009

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

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

0 голосов
/ 07 августа 2012

Поскольку у вас 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, а не Trusted Authentication = True.

0 голосов
/ 16 июля 2009

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

0 голосов
/ 16 июля 2009

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

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

0 голосов
/ 16 июля 2009

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

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

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

...