Управление доступом для кода в ASP.NET
Обновлен: Ноябрь 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="https://www.contoso.com"/>
</location>
Элемент конфигурации trust можно применять на уровне компьютера (тогда все приложения ASP.NET будут работать на этом уровне доверия) или на уровне корневого каталога какого-либо приложения в иерархии (тогда данный уровень доверия будет относиться к конкретным приложениям ASP.NET). Если требуется установить политику безопасности для всего узла, то можно сделать это путем редактирования файла Web.config корневого приложения веб-узла и указания корневого каталога веб-узла в качестве пути расположения, как в следующем примере:
<location path="ContosoSite" allowOverride="false">
<trust level="High"
originUrl="https://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 |
---|---|---|---|---|---|
Full |
High |
Medium |
Low |
Minimal |
|
Нет ограничения |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
Нет ограничения |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
Read: TEMP, TMP, OS, USERNAME, COMPUTERNAME |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
Read, Write, Append, PathDiscovery: каталог приложения |
Read, PathDiscovery: каталог приложения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
AssemblyIsolationByUser, нет ограничения на UserQuota |
1 МБ UserQuota (может быть изменено для отдельных веб-узлов), AssemblyIsolationByUser |
Нет разрешения |
|
Нет ограничения |
Нет разрешения |
Нет разрешения |
|||
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
||
Нет ограничения |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
|||
Нет ограничения |
Нет разрешения |
Нет разрешения |
|||
Нет ограничения |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
Connect к исходному веб-узлу (если настроено) |
Нет разрешения |
Нет разрешения |
|
Нет ограничения |
Нет ограничения |
Нет ограничения |
Нет разрешения |
Нет разрешения |
|
Журнал событий |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Очередь сообщений |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Контроллер служб |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Счетчики производительности |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Служба каталогов |
Нет ограничения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Нет разрешения |
Если уровень разрешений доступен, но не указан явно в политике безопасности, то приложения, выполняющиеся с разрешениями 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>