从ASP.NET访问“用户实例”数据库时出现用户权限错误

时间:2009-07-15 21:17:36

标签: asp.net .net sql sql-server permissions

最近迁移了托管csharpindepth.com的服务器。

大多数工作正常,但我无法进入用于举行勘误表,数据库等的数据库。

相关细节:

  • 32位Windows Server 2003
  • 已安装SQL Server Express 2005
  • 在“NETWORK SERVICE”帐户下运行的ASP.NET池
  • .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.

编辑:更多信息,这是堆栈跟踪:

[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从未显示它触及文件...

编辑:更奇怪 - 重启应用程序池,在本地系统帐户仍然下运行它有问题,这有点奇怪!就好像,尽管有错误消息,它实际上是在尝试做一些不可能的事情(例如使用错误的路径),而不仅仅是一个权限问题。

编辑:更多信息 - 我只是从服务中运行我的小测试控制台应用程序作为“网络服务”并且(在初始尝试超时后)它成功了。因此,就用户帐户而言,这不是一个权限...它是关于它运行的环境......

9 个答案:

答案 0 :(得分:6)

子实例是否开始了?当请求RANU数据库时,主实例(在这种情况下为。\ SQLEXPRESS)必须创建一个'子'实例,换句话说,启动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(例如,从作为NEWTORK SERVICE的交互式cmd控制台启动,也许使用at.exe将来安排1分钟)。如果可行,最后一步是尝试使用常规sp_attach_db附加MDF。

这些步骤的想法不是解决问题,而是查明失败的原因,因为你得到的错误是有点通用的......并不完全有用。

答案 1 :(得分:3)

此问题似乎与:"Cannot open user default database. Login failed." after installing 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 :(得分:2)

你做过这个吗?

  

配置SQL Server for Windows   综合安全

     

从Windows“开始”菜单中选择   单击Microsoft SQL Server,然后选择   企业经理。

     

打开服务器的节点   展开数据库的节点   想要为用户授予权限。

     

右键单击“用户”节点,然后选择   新数据库用户。

     

在“数据库用户属性”对话框中   框,在中输入域\用户名   “登录名”框,然后单击“确定”。   此外,配置SQL Server   允许所有域用户访问   数据库。

Source

所以基本上验证你在那里列出了“NT AUTHORITY \ NETWORK SERVICE”。

至少在SQL 2008中,不确定2005年你也会在服务器级别设置它(服务器 - &gt;安全 - &gt;登录)。

答案 3 :(得分:2)

  

集成安全性=真

数据库中的用户登录是否连接到计算机中的用户帐户?难道周围存在一些映射问题吗?

答案 4 :(得分:1)

如果您正在使用用户实例化,那么您无论如何都要以管理员身份进行连接,这就是为什么不推荐用于托管方案的原因。我倾向于获得的perms问题是文件本身的物理问题,而不是文件夹 - 分离数据库有剥离权限的倾向。

如果您可以准确缩小发生异常的位置,可能会有所帮助。它试图采取什么行动?数据库打开,读,写?还尝试另一个数据库(即,它是特定的数据库)并尝试非用户实例版本;将数据库附加到实例。

答案 5 :(得分:0)

我要做的第一件事是关闭filemon(或更好Process Monitor) 以查看IIS进程是否能够打开数据库文件 - 这对我来说似乎是一个安全问题。

另外:确保〜/ App_Data文件夹不是只读的。另外,请检查您是否已授予对同一文件夹的“网络服务”帐户的完全权限。

您可能希望运行IISRESET以重新启动IIS并刷新其权限。

答案 6 :(得分:0)

当您说用户拥有该文件的完全权限时,所有用户是否都拥有app_data目录的完全权限? Sql需要在MDF文件旁边创建一个锁文件。

您还确定SQL Express实例已启用用户实例吗?

答案 7 :(得分:0)

您是否尝试在服务器上运行aspnet_regsql.exe以使某些东西重新回到原位(有点像在蓝月亮中运行aspnet_regiis一次)? Scott Gu对here的整个过程进行了基本概述。

答案 8 :(得分:0)

由于您具有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。