сможем использовать утилиту permview.exe для просмотра полномочий, нацеливая ее на файл сборки, содержащий манифест сборки:
permview.exe assembly.dll
Вывод для приложения, использующего три показанных атрибута, будет выглядеть так.
minimal permission set:
<PermissionSet class='System.Security.PermissionSet' version='1'>
<IPermission class='System.Security.Permissions.UIPermission, mscorlib, Version=1 .0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
version='1' Unrestricted='true' />
</PermissionSet>
optional permission set:
<PermissionSet class='System.Security.Permission.Set' version='1'>
<IPermission class='System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
version='1'
Flags='UnmanegedCode' />
</PermissionSet>
refused permission set:
<PermissionSet class='System.Security.PermissionSet' version='1' >
<IPermission class='System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
version='1'
Read='C:' />
</PermissionSet>
В дополнение к запрашиваемым полномочиям можно также запросить целое множество прав сразу. Так как некоторые множества полномочий (Internet
, LocalIntranet
и Everything
) изменяются с помощью политики безопасности при выполнении сборки, то они запрашиваться не могут. Например, если сборка сообщила, что ей необходимо предоставить для выполнения все полномочия в множестве полномочий LocalIntranet
, а администратор затем сузил множество прав LocalIntranet
во время выполнения приложения, то может быть неизвестно, в каком множестве прав происходит работа.
Существует три множества полномочий, которые нельзя изменить во время выполнения приложения, эти множества могут запрашиваться с помощью атрибутов:
□ Nothing
□ Execution
□ FullTrust
Вот пример того, как запрашивается встроенное множество полномочий:
[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum,
Name = 'FullTrust')]
В этом примере сборка запрашивает, как минимум, встроенное множество полномочий FullTrust
. Если это множество не будет предоставлено, то сборка породит во время выполнения исключение безопасности.
Неявное полномочие
Часто, когда предоставлена некоторые полномочия, возникает неявное утверждение, что также даны и другие полномочия. Например, если присвоено полномочие FileIOPermission
для C:
, то неявно предполагается, что также имеется доступ к его подкаталогам (допущение системы безопасности учетных записей Windows).
Если необходимо проверить, что данное полномочие неявно вносит другое полномочие в качестве подмножества, то можно сделать следующее.
// Пример из SecurityApp5
class Class1 {
static void Main(string[ ] args) {
CodeAccessPermission permissionA =
new FileIOPermission(FileIOPermissionAccess.AllAccess, @'C:');
CodeAccessPermission permissionB =
new FileIOPermission(FileIOPermissionAccess.Read, @'C: emp');
if (permissions.IsSubsetOf(permissionA) {
Console.WriteLine('PermissionB is a subset of PermissionA');
} else {
Console.WriteLine('PermissionB is NOT a subset of PermissionA');
}
}
}
Вывод будет выглядеть следующим образом:
PermissionB is a subset of PermissionA
Отказ от полномочий
Существуют ситуации, когда необходимо быть абсолютно уверенным, что вызываемый метод действует в защищенном окружении, где он не может сделать ничего неблагоприятного. Предположим, нужно сделать вызов класса независимого поставщика и при этом точно знать, что он не получит доступ к локальному диску.
Чтобы достичь этого, создается экземпляр полномочия, который не должен получить метод а затем перед вызовом класса вызывается метод Deny()
:
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityApp6 {
class Class1 {
static void Main(string[] args) {
CodeAccessPermission permission =
new FileIOPermission(FileIOPermissionAccess.AllAccess, @'C:');
permission.Deny();
UntruscworthyClass.Method();
CodeAccessPermission.RevertDeny();
}
}
class UntrustworthyClass {
public static void Method() {
try {
StreamReader din = File.OpenText(@'C: extfile.txt');
}