【问题标题】:Cannot open user default database无法打开用户默认数据库
【发布时间】:2009-11-30 03:23:10
【问题描述】:

我从服务器上提取了一个ASPNETDB.MDF 文件,用于对我的本地计算机使用表单身份验证的 ASP 站点。我使用 ASP.NET 网站配置工具向数据库文件添加了一个新用户。我将 MDF 文件上传回服务器,现在每当我尝试以任何用户身份登录时都会出现以下异常:

Cannot open user default database. Login failed.
Login failed for user 'NT AUTHORITY\NETWORK SERVICE'

我也一直在谷歌上搜索并阅读了关于这个问题的所有其他解决方案,但没有找到任何有效的方法。

服务器上有 SQL Server 2008,这就是我在本地机器上使用的 VS 2008 Professional。

我的连接字符串是(为便于阅读添加了换行符):

<add name="ASPNETDBConnectionString1" 
     connectionString="Data Source=.\SQLEXPRESS;
                       AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
                       Integrated Security=True;User Instance=True" 
     providerName="System.Data.SqlClient"
/>

我是 SQL Server 新手,所以我很确定我在某个地方搞砸了。

非常感谢任何帮助。

【问题讨论】:

    标签: asp.net sql-server-2008 database-connection


    【解决方案1】:

    所有关于谁或什么或为什么与配置有关的问题......

    您的问题可以从连接字符串中推断出来。这将在本地对 sql express 起作用,但不适用于服务器上的 sql。

    第一个线索是只有 SqlExpress 启用了用户实例。在 Sql 上,您必须附加 mdf。

    如果在 VS 2008 中该连接字符串在您的机器上工作,则您已安装 SQL EXPRESS。如果该连接字符串在服务器上有效,则服务器安装了 SQL EXPRESS。

    如果服务器没有安装和配置 Sql Express 以允许用户实例,我希望它没有,该连接字符串将导致您遇到登录失败异常。

    我也想知道你的副本来自/来自。通常情况下,活动 mdf 的访问将被拒绝,即使是复制也是如此。

    请确认客户端和服务器端的 Sql 版本,并尝试查找两个 web.config 文件的先前副本以比较连接字符串。

    【讨论】:

    • 这些都是很好的解决方案,但是我发现将我安装的版本与服务器上的版本进行检查会发现一些不一致的地方。我的机器上似乎有以前安装的残留物导致了一些问题。
    • 很高兴它成功了。是一个相当典型的场景,但并不总是很明显。
    【解决方案2】:

    我认为您的问题是您没有跟踪数据库登录和数据库用户之间的区别。登录可以访问 SQL Server (一般来说)。数据库用户是已被授予访问特定数据库的登录名。当您来回复制文件时,您可以使登录帐户(尤其是 Windows 帐户)的基础标识符无效。

    我建议您使用 SQL 帐户(而不是 Windows 帐户)登录到您的 SQL 服务器,并将凭据放在 web.config 文件中。我只是发现这比 Windows 帐户登录更容易配置、使用和更改。设置登录后,只需确保它还具有对您要使用的服务器上数据库的用户访问权限。您可能仍会遇到传输问题(尽管可能性较小),但修复它们要容易得多。

    重要提示:其他人不同意 - 认为 Windows 帐户更安全 - 所以您可能想在这个问题上自学!

    【讨论】:

    • 他说的是添加Forms认证用户。这些只是 .Net 为此目的创建的表中的数据库行。
    【解决方案3】:

    您对问题的描述不完整或与错误不一致。您需要提供更多信息以获得更好的答案,但这是我的初步答案。

    该错误表明您的应用程序正在对 SQL 使用集成身份验证。因此,查看连接字符串会有所帮助。它可能在某处说“SSPI”。这意味着应用容器作为(网络服务)运行的用户正在尝试连接到数据库,但它不能,因为它没有这样做的权限。

    所以您要么更改了连接字符串作为您所做的一部分,要么 NETWORK SERVICE 以前是数据库用户(我认为这不是一个好主意)。

    您的 web.config 中可能还有其他与安全相关的设置。您的应用似乎使用表单身份验证。如果 IIS 设置为允许匿名访问,并且您的 web.config 设置为进行模拟,那么这也可能导致 NETWORK SERVICE 尝试连接到 SQL。

    应用程序应该如何连接?您是否有一个服务帐户(单个用户帐户),所有通过表单身份验证进行身份验证的用户都应通过该服务帐户进行数据库操作?如果是这样,那么您需要更改数据库连接字符串以包含用户和密码。

    为了解决这个问题,您需要检查您的连接字符串、web.config 中任何与表单身份验证相关的设置以及 IIS 中的安全设置。我认为这与您添加用户这一事实无关。

    编辑: 所以你正在使用集成安全,就像我怀疑的那样。这不适用于 Forms Auth,因为当用户使用其用户 ID 对您的应用程序进行身份验证时,您的应用程序使用集成身份验证(即网络服务)对数据库进行身份验证。您需要一个数据库服务帐户,imo,如果您不更改连接字符串,我不知道以前这如何工作。

    【讨论】:

    • 我根本没有修改 web.config。刚刚复制了 MDF 文件。我假设我弄乱了副本中的某些属性或某些东西。在我将修改后的 MDF 复制过来之前,这是有效的,并且希望暂时继续使用当前的 web.config 文件。
    • 标记是正确的,数据库用户在实例之间不可移植,并且在服务器之间移动的数据库需要将登录名重新映射到该数据库。您可以随时尝试这样做,但它不允许 NETWORK SERVICE 连接到您的数据库。您使用普通的数据库驱动的 Forms Auth,没有任何 Active Directory 集成,对吗?不得不承认,我从来没有用过SQLEXPRESS,但是我觉得安全性和SQL Server没有什么不同。
    • 顺便说一句,创建允许您添加和编辑表单身份验证用户帐户的 Web 表单非常容易。来回移动数据库可能不是管理用户的最佳方式。
    • 这是我来之前的全部设置。同样,我根本没有修改服务器上的 web.config 文件。我刚刚复制了 mdf 文件。我需要弄清楚如何使这项工作。网络服务根据文件和文件夹的属性,确实可以访问它。
    • 如果网络服务是您数据库中的用户,请检查 Management Studio。如果是,将其从数据库中删除(不要删除登录名)。然后将网络服务登录以用户身份重新映射到您的数据库(右键单击、属性、用户映射)。如果您的数据库中没有网络服务登录,我不知道发生了什么。我建议设置一个服务帐户。 social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/…
    【解决方案4】:

    您可以尝试更改此设置吗 应用程序池->高级设置->进程模型->身份 ?

    我遇到了同样的错误并通过更改流程模型进行修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多