SqlException: у пользователя нет разрешения на выполнение этого действия

Я использовал свой веб-сайт (ASP.NET MVC) в Visual Studio, но теперь хочу разместить его на своем сервере. Я опубликовал из Visual Studio в общий сетевой ресурс, который будет использоваться. Сервер работает под управлением Windows Home Server, IIS 6 и SQL Server 2008 R2 (экспресс).

В Microsoft SQL Server Management Studio я подключил базу данных и убедился, что пользователь IUSR_SERVER является владельцем db. Я также убедился, что пользовательская Сетевая служба имеет доступ.

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

В web.config есть такая строка подключения:

        <connectionStrings>
    <remove name="ApplicationServices" />
  <add name="ApplicationServices" connectionString="Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=MyDatebase"
   providerName="System.Data.SqlClient" />
     </connectionStrings>

Однако я не могу просматривать свой веб-сайт. Я получаю только эту ошибку:

Ошибка сервера в приложении '/'

У пользователя нет разрешения на выполнение этого действия. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.Data.SqlClient.SqlException: у пользователя нет разрешения на выполнение этого действия.

Ошибка источника:

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

Трассировки стека:

[SqlException (0x80131904): у пользователя нет разрешения на выполнение этого действия.]
System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) +4846887 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarningStatus ) +194

Такое ощущение, что все перепробовала. Буду очень признателен за вашу помощь в этом.

РЕДАКТИРОВАТЬ:

This is the event in the event viewer:
Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 2010-06-05 23:55:08 
Event time (UTC): 2010-06-05 21:55:08 
Event ID: 88a3a76c00a34e21bf6e711b3b3a8f21 
Event sequence: 137 
Event occurrence: 59 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/6893/Root-2-129202466028125000 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:\Inetpub\WebPage\ 
    Machine name: SERVER 

Process information: 
    Process ID: 5864 
    Process name: w3wp.exe 
    Account name: SERVER\USER

Exception information: 
    Exception type: SqlException 
    Exception message: User does not have permission to perform this action. 

Request information: 
    Request URL: http://localhost/ 
    Request path: / 
    User host address: 127.0.0.1 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: SERVER\USER

Thread information: 
    Thread ID: 1 
    Thread account name: SERVER\USER
    Is impersonating: True 
    Stack trace:    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   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.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, 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)     

Custom event details: 

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

person Oskar Kjellin    schedule 01.06.2010    source источник
comment
Странно то, что мой регистратор (Log4Net) записывает журнал в таблицу в базе данных ...   -  person Oskar Kjellin    schedule 05.06.2010


Ответы (4)


Оказывается, проблема заключалась в том, что мой DataContext использовал собственную строку подключения, которой не было в web.config. Следовательно, он никогда не менялся, и соединение не могло быть установлено. Я изменил свой код так, чтобы мой datacontext использовал строку из web.config, и это сработало :)

person Oskar Kjellin    schedule 06.06.2010

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

Когда вы перемещаете базы данных между серверами, вы должны исправить логины пользователей, потому что они стали сиротами. Внутренний идентификатор на новом сервере отличается, поэтому вы исправите логин пользователей, выполнив следующую команду TSQL:

EXEC sp_change_users_login 'Auto_Fix', 'IUSR_Server'

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

person Raj More    schedule 01.06.2010
comment
Спасибо, но все, что я получил, - это количество потерянных пользователей, исправленных обновлением пользователей, равное 0. Количество потерянных пользователей, исправленных путем добавления новых учетных записей и последующего обновления пользователей, было равно 0. - person Oskar Kjellin; 02.06.2010
comment
@Raj Спасибо за беспокойство, надеюсь, мы сможем разобраться с этим. В разделе Server- ›Security-› Logins находится пользователь IUSR_SERVER, в разделе Server-Databases- ›MyDatabase-› Security- ›Users находится пользователь IUSR_SERVER, вы это имели в виду? - person Oskar Kjellin; 02.06.2010
comment
@Raj More Возможно, это как-то связано с этим? (Из web.config) ‹identity impersonate = true /› - person Oskar Kjellin; 02.06.2010
comment
@Oskar Kjellin - Вы знаете, какое имя пользователя подключается с веб-сайта к базе данных? Вы должны запустить профилировщик и узнать имя пользователя, а затем проверить разрешения для этого имени пользователя. - person Raj More; 02.06.2010
comment
@Raj В средстве просмотра событий я вижу, что это пользователь сетевой службы вызывает исключение. - person Oskar Kjellin; 05.06.2010
comment
Что ж, тогда к базе данных подключается сетевая служба, а не пользователь. Вы должны правильно настроить свое олицетворение. - person Raj More; 07.06.2010

Вы проверили, что учетная запись IUSR_Server имеет полный доступ к базе данных SQLExpress в файловой системе?

Вы также можете попробовать запустить пул приложений в IIS как IUSR_Server (приложение работает в собственном пуле приложений, верно?). Затем измените безопасность вашего веб-сайта для анонимного пользователя на значение по умолчанию. Когда вы это сделаете, убедитесь, что учетная запись IUSR_Server является частью группы IIS_WPG, это предоставит учетной записи все правильные разрешения для олицетворения в пуле приложений.

person Jimmie R. Houts    schedule 01.06.2010
comment
Да, приложение находится в собственном пуле приложений. Но как я могу изменить его, чтобы он работал как IUSR_Server, если у меня нет этого пароля? - person Oskar Kjellin; 05.06.2010
comment
не осознавал, что вы используете базовую учетную запись IUser. Чтобы последовать моему предложению, вам нужно будет создать учетную запись специально для веб-сайта, предоставить ей все необходимые разрешения файловой системы и добавить ее в группу пользователей IIS_WPG. - person Jimmie R. Houts; 05.06.2010
comment
Спасибо, но я получаю то же самое sqlexception: S - person Oskar Kjellin; 05.06.2010

В следующей строке № 3

Информация о теме:
ID темы: 1
Имя учетной записи темы: SERVER \ USER

‹- что такое СЕРВЕР \ ПОЛЬЗОВАТЕЛЬ, это ваш IUSER или сетевая служба? если это сетевая служба (обычно это идентификатор пула приложений), ваше имя учетной записи потока должно иметь доступ к вашей базе данных сервера Sql. Идеальным решением было бы либо изменить конфигурацию, указав явные учетные данные, либо убедиться, что имя учетной записи Thread имеет полный доступ (чтение / запись) к вашей базе данных.

person Akash Kava    schedule 06.06.2010
comment
Спасибо, Акаш. Пользователь - это настроенный пользователь, которого я добавил на сервер, а также на сервер sql, см. Мой собственный ответ для разрешения этого - person Oskar Kjellin; 06.06.2010