ASP.NET中的LINQ - 在部署到服务器时抛出异常

时间:2009-06-28 20:34:18

标签: c# asp.net sql-server linq

我在ASP.NET应用程序中通过LINQ连接到SQL Server数据库(将结果返回给Web服务)。问题是它只在我在调试/测试模式下运行它时返回结果 - 当我发布服务时,我收到一个错误告诉我 “用户'NT AUTHORITY \ NETWORK SERVICE'登录失败”

那么如何设置/提供我希望站点用于登录SQL Server的凭据?

提前感谢您提供任何帮助

4 个答案:

答案 0 :(得分:2)

您必须在连接字符串中设置凭据。

服务器上使用的连接字符串可能与开发期间使用的凭据不同。询问您的DBA您应该使用哪些凭据。

答案 1 :(得分:2)

您可能没有将连接字符串传递给DataContext构造函数,导致您的程序使用构造函数中的连接字符串,而该构造函数已用于开发。

所以不要使用这样的东西:

using (var dc = new MyDataContext()) {
   ...
}

使用

using (var dc = new MyDataContext(MyConnectionString)){
  ...
}

...并从配置文件中获取MyConnectionString ...

答案 2 :(得分:1)

首先提出几个问题

  1. SQL服务器是否在同一台机器上?
  2. 如果它在不同的机器上,它是否在域中?
  3. 您使用的是完整的SQL安装还是SQL Express?
  4. 我将假设您使用的是完整版本的SQL,因为如果您使用的是SQL Express用户实例,则不会出现此问题。

    如果它位于同一台计算机上,则需要将网络服务添加到SQL中允许的用户列表中。要执行此操作,请启动SQL Management Studio,展开安全性文件夹,然后右键单击“登录”并选择“新建登录”。单击“登录 - 新建”对话框上的搜索,确保选中“Windows身份验证”,然后在“对象名称”框中输入“网络服务”,然后单击“确定”。从Login - new页面的下拉列表中选择要访问的数据库,然后单击ok。最后展开数据库文件夹,为每个要授予访问权限的数据库扩展安全性,右键单击用户,然后选择网络服务登录名,在网络服务对话框中为其命名,并通过以下方式授予其访问权限:检查数据库角色成员资格列表中的角色。如果你在乱搞db_owner就没问题,你会想要稍后将其锁定。

    如果SQL服务器位于不同的框中,并且您在域中,则可以将域应用程序池作为域用户运行,并在SQL框上授予该访问权限。如何执行此操作因IIS版本而异。

    最后,如果SQL服务器配置为执行此操作,则可以使用SQL登录名和密码。创建一个SQL用户,然后将它们添加到连接字符串中,如此

    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;
    

答案 3 :(得分:1)

在您的问题中,目前还不清楚您是否在开发和生产之间使用不同的数据库。通常,您将拥有(至少)两个数据库副本,并且通常通过更改Web配置中的值来设置连接字符串以指向正确的环境。或者,您可以使用Dave提及的技术在运行时设置连接字符串。

在您的情况下,我怀疑您使用的是集成身份验证,并且通过SQL安全权限来防范。通过在Visual Studio中调试它在本地环境中进行测试时,它将在您的安全凭据下运行。最有可能的是,您的用户帐户是数据库中的管理员(数据库所有者),因此您拥有对数据库的完全权限。

部署时,IIS正在NetworkService凭据下运行。当您尝试访问数据库时,请求失败,因为NetworkService未在每个表/视图/ sprocs / etc上的数据库中获得权限。

如果在服务器上设置了混合模式,则可以将每个数据库对象的权限设置为SQL用户,并在web.config中设置SQL用户和密码。或者,您可以更改IIS进程在其下工作的用户帐户,并将数据库配置为与该用户一起使用。