Управление доступом для кода в ASP.NET

Visual Studio 2010

Обновлен: Ноябрь 2007

Одним из преимуществ использования ASP.NET для размещения нескольких веб-узлов является поддержка в общеязыковой среде выполнения (CLR) управления доступом для кода в целях защиты серверных приложений. Код соотносится с классификацией по зонам безопасности на основе данных о происхождении кода, таких как строгое имя для сборки или URL-адрес исходного кода.

Приложения, работающие с полным доверием, можно также ограничивать и разрешениями для NTFS-файлов, разрешениями для базы данных и т. д. с помощью учетной записи Windows (удостоверения процесса ASP.NET), в которой они выполняются. Дополнительные сведения см. в разделе Настройка удостоверения процесса ASP.NET.

Как правило, можно настроить управление доступом для кода для отдельной сборки, сделав ее сборкой со строгим именем и добавив политику безопасности для этой сборки. Однако многие сборки ASP.NET создаются динамически во время компиляции страницы и, следовательно, не имеют строгого имени, поэтому необходимо настроить политику безопасности для этих сборок косвенно. Кроме того, так как ASP.NET поддерживает некомпилируемые приложения, свидетельство на основании сборки не поддерживается. Так как приложения ASP.NET включают концепцию структуры каталогов, гораздо проще настроить управление доступа для кода на основе категорий приложений ASP.NET, чем вручную настраивать платформу .NET Framework для работы с каждым приложением ASP.NET на компьютере по отдельности.

ASP.NET позволяет присвоить каждому приложению настраиваемый уровень доверия, который соотносится с предопределенным набором разрешений. По умолчанию приложениям назначается уровень доверия в зависимости от предоставленного ими свидетельства. Если требуется запустить веб-приложение с меньшим набором разрешений, чем Full, необходимо применять политику частичного доверия, воспользовавшись одним из предопределенных уровней доверия, заданных в файлах Уровни доверия и файлы политик ASP.NET.

Чтобы переопределить поведение по умолчанию и связать приложение с определенной политикой безопасности, можно использовать следующие параметры конфигурации в файле Web.config приложения:

<location path="SampleApp" allowOverride="false">
  <trust level="High" 
    originUrl="http://www.contoso.com"/>
</location>

Элемент конфигурации trust можно применять на уровне компьютера (тогда все приложения ASP.NET будут работать на этом уровне доверия) или на уровне корневого каталога какого-либо приложения в иерархии (тогда данный уровень доверия будет относиться к конкретным приложениям ASP.NET). Если требуется установить политику безопасности для всего узла, то можно сделать это путем редактирования файла Web.config корневого приложения веб-узла и указания корневого каталога веб-узла в качестве пути расположения, как в следующем примере:

<location path="ContosoSite" allowOverride="false">
  <trust level="High" 
    originUrl="http://www.contoso.com"/>
</location>

Для надежных узлов рекомендуется установить атрибут level элемента конфигурации trust в значение High. Для ненадежных узлов, таких как веб-сервер, на котором размещены узлы, запускающие код от внешнего клиента, рекомендуется установить атрибут level элемента конфигурации trust в значение Medium. Подробное описание выполнения приложений ASP.NET ср средним (medium) уровнем доверия см. в разделе «Инструкции: использование среднего уровня доверия в ASP.NET 2.0» руководства Шаблоны и рекомендации по обеспечению безопасности приложений.

При настройке параметров доверия на уровне компьютера или узла атрибуту allowOverride обычно присваивается значение false в элементе расположение, чтобы отдельные приложения не могли сами задать свой уровень доверия. Это обычная установка для общего сервера.

В следующей таблице приводится перечень поддерживаемых по умолчанию атрибутов элемента конфигурации trust.

Атрибут

Описание

Поддерживаемые значения

level

Задает зону безопасности, в которой будет выполняться приложение.

Full, High, Medium, Low и Minimal.

originUrl

Задает URL-адрес или URL-шаблон, которому разрешено подключение с помощью классов в пространстве имен System.Net. Если этот атрибут присутствует, то его можно использовать для проверки разрешений некоторых объектов, таких как экземпляр WebRequest, который позволяет подключение к различным сетевым папкам. Например, можно настроить этот атрибут с именем узла серверов в веб-ферме так, что страницы ASP.NET смогут вызывать веб-службы, развернутые в одной веб-ферме, как веб-приложение.

URL-адреса с правильным форматом HTTP, или синтаксис на основе регулярных выражений, который поддерживается атрибутом WebPermissionAttribute.

В следующей таблице приводится перечень типов разрешений, поддерживаемых в среде CLR, и политики по умолчанию для каждого разрешения на различных уровнях доверия.

Разрешение

Full

High

Medium

Low

Minimal

AspNetHostingPermission

Full

High

Medium

Low

Minimal

ConfigurationPermission

Нет ограничения

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

DnsPermission

Нет ограничения

Нет ограничения

Нет ограничения

Нет разрешения

Нет разрешения

EnvironmentPermission

Нет ограничения

Нет ограничения

Read: TEMP, TMP, OS, USERNAME, COMPUTERNAME

Нет разрешения

Нет разрешения

FileIOPermission

Нет ограничения

Нет ограничения

Read, Write, Append, PathDiscovery: каталог приложения

Read, PathDiscovery: каталог приложения

Нет разрешения

IsolatedStorageFilePermission

Нет ограничения

Нет ограничения

AssemblyIsolationByUser, нет ограничения на UserQuota

1 МБ UserQuota (может быть изменено для отдельных веб-узлов), AssemblyIsolationByUser

Нет разрешения

PrintingPermission

Нет ограничения

DefaultPrinting

DefaultPrinting

Нет разрешения

Нет разрешения

ReflectionPermission

Нет ограничения

ReflectionEmit

Нет разрешения

Нет разрешения

Нет разрешения

RegistryPermission

Нет ограничения

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

SecurityPermission

Нет ограничения

Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration

Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration

Execution

Execution

SmtpPermission

Нет ограничения

Connect

Connect

Нет разрешения

Нет разрешения

SocketPermission

Нет ограничения

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

WebPermission

Нет ограничения

Нет ограничения

Connect к исходному веб-узлу (если настроено)

Нет разрешения

Нет разрешения

SqlClientPermission

Нет ограничения

Нет ограничения

Нет ограничения

Нет разрешения

Нет разрешения

Журнал событий

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

Нет разрешения

Очередь сообщений

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

Нет разрешения

Контроллер служб

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

Нет разрешения

Счетчики производительности

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

Нет разрешения

Служба каталогов

Нет ограничения

Нет разрешения

Нет разрешения

Нет разрешения

Нет разрешения

Если уровень разрешений доступен, но не указан явно в политике безопасности, то приложения, выполняющиеся с разрешениями Full, всегда могут его использовать. Приложения, работающие с более низкими уровнями доверия, не смогут использовать ресурсы, если не предоставить им явные разрешения по изменению политики безопасности.

Как показано в таблице, приложения с набором разрешений High имеют разрешение на чтение/запись файлов в своих каталогах, а приложения с уровнем доверия Low имеют разрешение только на чтение файлов в своих каталогах. Поскольку тип FileIOPermission опирается на физический путь (например c:\SampleAppPath), ASP.NET использует в файлах политики размеченный оператор, который во время выполнения заменяется соответствующими сведениями о пути приложения.

Тип WebPermission позволяет приложению подключиться к расположению в сети, определяемому исходным атрибутом узла, с помощью таких классов, как System.Net.WebRequest. В ASP.NET можно настроить это разрешение, предоставляя дополнительный атрибут originUrl в разделе trust для данного приложения. Атрибут originUrl заменяет переменную $OriginHost$ в файлах политики, как показано в следующем разделе кода из файла Web_hightrust.config:

<IPermission class="WebPermission" version="1">
  <ConnectAccess>
    <URI uri="$OriginHost$"/>
  </ConnectAccess>
</IPermission>
Показ: