【问题标题】:Error accessing Schema from web app over over local network通过本地网络从 Web 应用程序访问架构时出错
【发布时间】:2017-01-27 10:25:01
【问题描述】:

我有一个在运行服务器的计算机上正常运行的 Web 应用程序,但是当我尝试通过本地网络在另一台设备上运行该 Web 应用程序时出现以下错误:

指定的架构名称“WORKGROUP\LAPTOP-1”要么不存在,要么您没有使用它的权限。

我要执行的命令如下:

protected void Home_pt()
{
    string nametime;
    string name;
    string time;
    string tname = null;
    SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");

    if (thiddenfield.Value == String.Empty)
    {
        Show("error: empty tname");
    }
    else
    {
        tname = thiddenfield.Value;
    }

    using (var cmd = new SqlCommand("SELECT name FROM trecordTable WHERE name='" + tname + "'", conn))
    {
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            List<string> namedatelist = new List<string>();
            while (reader.Read())
            {
                name = reader["name"].ToString();
                time = DateTime.Now.ToString("MM-dd-yyyy");
                namedatelist.Add(name + time);
            }
            nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", "");
            Session["nametime"] = nametime;
            hftstate.Value = nametime;
        }
    }
}

protected void Fill_t(object sender, EventArgs e)
{
    var nametime = Session["nametime"].ToString();
    SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");

    conn.Open();

    using (var cmdtx1 = new SqlCommand("IF OBJECT_ID('" + nametime + "') IS NULL CREATE TABLE " + nametime + "([Id]    INT   IDENTITY NOT NULL,  [item]  NVARCHAR(50) NULL,  [CtrlType] NVARCHAR(50) NULL,  [six] NVARCHAR(50) NULL,  [seven]  NVARCHAR(50) NULL,  [eight]  NVARCHAR(50) NULL); IF NOT EXISTS(SELECT item FROM " + nametime + ") INSERT INTO " + nametime + " (item,CtrlType,hflabel) VALUES ('At','atscroll','cstat')", conn))
    {
        cmdtx1.ExecuteNonQuery();
    }
}

我应该在 SSMS 中编辑权限吗?

另外,我知道它很容易被注入,但我想先解决这个问题。

【问题讨论】:

  • nametime 的值是多少?
  • 它是根据用户输入程序生成的。基本上是输入的名称,然后是当前时间。
  • 我没有问它是如何创建的。我问它的价值是什么。你的问题就在那里。
  • 添加了额外的代码来显示它的来源。一个示例值为:“Pete01272017”
  • 所以你认为是 nametime 变量导致了问题,即使该命令在与服务器相同的机器上运行时也能正常工作?

标签: c# asp.net sql-server windows-authentication


【解决方案1】:

哇,Ubercoder 发布了大约 30 秒(然后删除?)的帖子成功了!

“我怀疑 nametime 未设置为包含所需的架构 - 通常这是 [dbo]

这应该有效”

using (var cmdtx1 = new SqlCommand(
 "IF OBJECT_ID('[dbo]." + nametime + @"') IS NULL 
    CREATE TABLE [dbo]." + nametime +  @"
     ([Id] INT IDENTITY NOT NULL,  
      [item]  NVARCHAR(50) NULL,  
      [CtrlType] NVARCHAR(50) NULL,  
      [six] NVARCHAR(50) NULL,  
      [seven]  NVARCHAR(50) NULL,  
      [eight]  NVARCHAR(50) NULL
     ); 


 IF NOT EXISTS(SELECT item FROM [dbo]." + nametime + @") 
  INSERT INTO [dbo]." + nametime + @"
      (item,CtrlType,hflabel) 
  VALUES ('At','atscroll','cstat')",
 conn))
{
cmdtx1.ExecuteNonQuery();
}

Ubercoder 如果您重新发布您的答案,我会将其标记为正确答案。

谁能解释一下为什么会这样?

【讨论】:

【解决方案2】:

因为您在连接字符串中使用了Integrated Security=True;Trusted_Connection=True,所以哪个用户连接到数据库以及使用哪个默认架构取决于Windows 环境。

您的 IIS 可能设置为使用与本地连接不同的 Windows 用户凭据进行远程连接。或者,如果您还在 IIS 中为您的应用程序启用了集成 Windows 身份验证,则客户端计算机上登录的 Windows 用户将用于针对数据库进行身份验证。

因此,要么不使用集成安全性,要么确保所有希望能够连接的用户都可以访问架构 dbo 并将其用作他们的默认架构。

请参阅this article,了解如何为 Windows 网络组设置默认架构。


警告:个人意见

按照 Ubercoder 的建议在 SQL 语句中指定模式名称也可以,但这通常不是一个好主意,因为这会使应用程序迁移到要共享数据的 SQL 服务器变得更加困难。具有不同应用程序的数据库或当您想要实现多租户场景时。

开发人员也很容易忘记在 sql 语句中添加模式前缀。当开发人员使用默认架构为 dbo 的登录时,在开发过程中就不会那么容易发现此错误。

【讨论】:

  • 不使用集成安全可以吗?这会产生什么样的漏洞?
  • 使用什么类型的认证很大程度上取决于你的应用场景。为 Windows 用户配置默认架构当然是更简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2015-09-08
相关资源
最近更新 更多