【问题标题】:LINQ in ASP.NET -- throws exception when deployed to the serverASP.NET 中的 LINQ——部署到服务器时抛出异常
【发布时间】:2009-06-28 20:34:18
【问题描述】:

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

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

提前感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      使用

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

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

      【讨论】:

        【解决方案3】:

        先问几个问题

        1. SQL 服务器是否在同一台机器上?
        2. 如果它在不同的机器上,它是否在域中?
        3. 您使用的是完整的 SQL 安装还是 SQL Express?

        我假设您使用的是完整版的 SQL,因为如果您使用的是 SQL Express,用户实例不会给您带来这个问题。

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          在您的情况下,我怀疑您正在使用集成身份验证,并且被 SQL 安全权限弄得措手不及。当您通过在 Visual Studio 中调试它在本地环境中对其进行测试时,它会在您的安全凭据下运行。很可能,您的用户帐户是数据库中的管理员(数据库所有者),因此您对数据库拥有完全权限。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-11
            • 2012-03-25
            相关资源
            最近更新 更多