【问题标题】:How to enforce a readonly LocalDB connection如何强制执行只读 LocalDB 连接
【发布时间】:2018-01-21 17:47:02
【问题描述】:

大多数人似乎有相反的问题,但解决方案是“授予对数据库的访问权限”。我想限制对数据库(LocalDB)的两个连接之一的访问。恐怕答案是“创建一个数据库用户并使用它来连接”。这仅用于测试,我不想提供用户。有没有办法通过连接字符串强制与 LocalDB 建立只读连接?我对此表示怀疑,但我想我会问。这是我当前的连接字符串:

<add name="readonlyConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Database=test;Trusted_Connection=True; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

实现要复杂得多,但基本上使用 System.Data.Entity.DbContext 类,如果有帮助的话。

【问题讨论】:

  • 在数据库中创建新用户有什么问题?当然,您需要用户来访问数据库,无论您是尝试读取、写入还是其他方式。
  • 我很懒,不想写更多的SQL来写测试。
  • 嗯,不具体,不,你不 -- Trusted_Connection=true 使用 Windows 凭据。所以数据库上有一个“用户”,但它只是开发人员的 Windows 帐户。目前没有用户配置。
  • 那个,既然你已经答案了,为什么还要在这里问呢?
  • 我的基本建议是将您的数据库用户(不是登录名)连同他们的权限一起置于源代码控制中。这样一来,您就可以使用它们进行测试,使用的权限与它们在生产环境中的权限完全相同。

标签: c# entity-framework localdb


【解决方案1】:

简短回答:不。

更长的答案:

您可以找到可用于连接字符串here 的所有选项;简而言之,分配给连接的权限与 ConnectionString 类无关;它们是数据库的关注点。

人们有tried to do this with Entity Framework,它只会导致一系列黑客攻击,而不仅仅是创建该死的用户。

这是你要做的(在非只读的上下文中):

        using (var connection = (db as DbContext).Database.Connection)
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "sp_executesql";
                command.CommandType = CommandType.StoredProcedure;
                var param = command.CreateParameter();
                param.ParameterName = "@statement";
                param.Value = @"
CREATE LOGIN readonlyLogin WITH PASSWORD='testpassword'
CREATE USER readonlyUser FROM LOGIN readonlyLogin
EXEC sp_addrolemember 'db_datareader', 'readonlyUser';
                ";
                command.Parameters.Add(param);
                connection.Open();
                try { 
                    command.ExecuteNonQuery();
                } catch (SqlException ex) {     // user already exists
                    if (ex.Errors[0].Number.Equals(15025)) { } else throw ex;
                }
            }
        }

然后,在您的测试项目的连接字符串中:

<add name="readonlyConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Database=test;Trusted_Connection=False;User Id=readonlyLogin;Password=testpassword;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2011-05-06
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多