禁用键入SQLCLR上运行的代码

时间:2011-09-16 11:06:30

标签: sql-server razor sqlclr code-access-security

最近我设法让Razor解析器在.NET 3.5下运行并由SQL Server 2008托管。目前,它只是一个实验,看看什么是可行的。这是有效的,包括动态编译剃刀模板程序集,然后将其加载到AppDomain(that was a mission!)。

因为SQLCLR不允许您在任何SQLCLR托管代码中使用Assembly.Load(),即使使用PERMISSION_SET = UNSAFE也是如此。我的解决方法是使用sp_executesql编译后直接注册程序集,我构建CREATE ASSEMBLY语句。当我动态渲染这些模板程序集时,我会使用PERMISSION_SET = SAFE这样做,以确保它们不会在安全程序集允许的范围之外执行任何操作。

现在棘手的部分是,这些剃刀模板在连接用户的上下文中运行,因此他们可以访问数据库,例如,在我的模板中,我可以做:

@import System.Data.SqlClient
@{
    using (var conn = new SqlConnection("Context Connection = true"))
    {
        conn.Open();
        // Execute something against the database
    }
}

PERMISSION_SET = SAFE将允许这一点,因为这是SQLCLR甚至存在的原因之一,但在这些模板程序集中,我想引入一些额外的安全性,这将允许我阻止用户对数据库执行任何操作。

有没有人知道如何使用代码访问安全性或其他方法来禁用类型,例如SqlConnectionSqlCommand

1 个答案:

答案 0 :(得分:0)

SqlClientPermission可用于阻止使用SqlConnection