SqlException: у пользователя нет прав на выполнение этого действия - PullRequest
3 голосов
/ 02 июня 2010

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

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

Веб-сайт настроен в 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.ThrowExceptionAndWarning (TdsParserStateObject stateObj) + 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.

Ответы [ 4 ]

2 голосов
/ 06 июня 2010

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

1 голос
/ 02 июня 2010

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

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

EXEC sp_change_users_login 'Auto_Fix', 'IUSR_Server'

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

1 голос
/ 02 июня 2010

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

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

0 голосов
/ 06 июня 2010

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

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

<- что такое SERVER \ USER, это ваш IUSER или сетевой сервис? если это сетевая служба (обычно это идентификатор пула приложений), ваше имя этой учетной записи потока должно иметь доступ к базе данных вашего сервера Sql. Идеальным решением было бы либо изменить конфигурацию, указав явные учетные данные, либо убедиться, что имя учетной записи потока имеет полный доступ (чтение / запись) к вашей базе данных. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...