我一直在visual studio中使用我的网站(ASP.NET MVC),但现在我想在我的服务器上托管它。我从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>
但是,我无法浏览我的网站。我只收到这个错误:
2>'/'应用程序中的服务器错误。用户无权访问 执行此操作。描述:一个 未处理的异常发生在 当前网络的执行 请求。请查看堆栈跟踪 有关错误的更多信息 它起源于代码。
异常详细信息: System.Data.SqlClient.SqlException: 用户没有权限 执行此操作。
来源错误:
生成了未处理的异常 在执行当前 网络请求。有关的信息 异常的起源和位置 可以使用例外来识别 堆栈跟踪下面。
堆栈追踪:
[SqlException(0x80131904):用户这样做 没有权限执行此操作 动作]
System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION exception,Boolean breakConnection) +4846887 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)+199
感觉就像我尝试了一切。非常感谢你对此的帮助。
修改
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.
答案 0 :(得分:2)
原来问题是我的DataContext使用了它自己的连接字符串,而不是在web.config中。因此,它从未改变过,也无法建立连接。我更改了我的代码,以便我的datacontext使用了web.config中的字符串,并且它有效:)
答案 1 :(得分:1)
您是否已验证IUSR_Server帐户是否可以完全访问文件系统中的SQLExpress数据库?
您还可以尝试将IIS中的应用程序池作为IUSR_Server运行(应用程序在其自己的应用程序池中运行吗?)。然后将匿名用户的网站安全性更改回默认值。执行此操作时,请确保IUSR_Server帐户是IIS_WPG组的一部分,这将为该帐户提供应用程序池中模拟的所有正确权限。
答案 2 :(得分:1)
权限不是由用户标识,而是由SQL Server为登录保存的内部标识。由于这些是两台服务器,因此两台计算机上的登录名的内部ID不同。
跨服务器移动数据库时,必须修复用户登录,因为它们会变为孤立状态。新服务器上的内部ID不同,因此您可以通过运行以下TSQL命令来修复用户登录:
EXEC sp_change_users_login 'Auto_Fix', 'IUSR_Server'
数据库中有用户,但服务器上也必须有登录名。您必须检查它们是否存在才能解决问题(如果它与数据库用户是一个孤儿有关)
答案 3 :(得分:0)
在第3行以后
线程信息:
线程ID:1
线程帐户名称:SERVER \ USER
&lt; - 什么是SERVER \ USER,是您的IUSER还是网络服务?如果是网络服务(通常是应用程序池的ID),则此线程帐户名应该有权访问您的Sql server数据库。理想的解决方案是通过提供显式凭据来更改配置,或确保线程帐户名称具有对数据库的完全访问(读/写)访问权限。