Недавно мне удалось заставить синтаксический анализатор Razor работать под .NET 3.5 и размещаться на SQL Server 2008. На данный момент это просто эксперимент, чтобы увидеть, что возможно. Это работает, включая динамическую компиляцию сборок шаблонов Razor, которые затем загружаются в AppDomain (это была миссия! а>).
Поскольку SQLCLR не позволяет использовать Assembly.Load() в любом размещенном коде SQLCLR, даже с 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 вообще существует, но в этих сборках шаблонов я хочу ввести некоторую дополнительную защиту, которая позволит мне предотвратить выполнение пользователями каких-либо действий с базой данных.
Кто-нибудь знает способ отключить типы, такие как SqlConnection
или SqlCommand
, возможно, с помощью Code Access Security или другого метода?