Добавление поддержки декларативной безопасности
Обновлен: Ноябрь 2007
Хотя это и не является обязательным требованием, пользовательское разрешение должно поддерживать декларативную безопасность, чтобы разработчики могли указывать это пользовательское разрешение, используя декларативный синтаксис для таких действий безопасности, как запросы, требования или утверждения. На самом деле запросы разрешений, требования связывания и требования к наследованию могут выполняться только декларативно. Поэтому пользовательское разрешение доступа к коду не сможет быть запрошено и использовано в требовании связывания или требовании к наследованию. В данной теме описывается, как применять класс Attribute, добавляющий поддержку декларативной безопасности для вашего пользовательского разрешения.
![]() |
---|
Версия атрибута пользовательского разрешения должна определяться в сборке, отличной от сборки, которая на нее ссылается. Пользовательское разрешение также должно определяться в этой сборке. Это является необходимым требованием при использовании декларативной безопасности, так как атрибут выполняется при загрузке сборки, и в тот момент, когда встречается ссылка на него, атрибут может быть еще не создан. При попытке использования декларативного разрешения в той же сборке, в которой он определен, приводит к возникновению исключения TypeLoadException. |
Атрибуты безопасности для объявлений должны (прямо или косвенно) наследовать класс SecurityAttribute. Если разрешение является разрешением доступа к коду, класс атрибута должен наследовать класс CodeAccessSecurityAttribute, который наследуется от SecurityAttribute. Классы атрибутов безопасности должны реализовать метод CreatePermission, создающий экземпляр объекта разрешения из связанного пользовательского разрешения. Обратите внимание, что связанное пользовательское разрешение должно быть помечено атрибутом SerializableAttribute, чтобы иметь возможность сериализоваться компилятором в метаданные. Дополнительные сведения см. в разделе Реализация пользовательского разрешения.
Следующий код реализует класс атрибута для разрешения Boolean CustomPermission. В данном примере класс разрешения содержит единственное свойство Boolean — Unrestricted, хранящее его состояние.
<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class
CustomPermissionAttribute
Inherits CodeAccessSecurityAttribute
Private myUnrestricted As Boolean = False
Public Shadows Property Unrestricted() As Boolean
Get
Return myUnrestricted
End Get
Set
myUnrestricted = value
End Set
End Property
Public Sub New(action As SecurityAction)
MyBase.New(action)
End Sub
Public Overrides Function CreatePermission() As IPermission
If Unrestricted Then
Return New CustomPermission(PermissionState.Unrestricted)
Else
Return New CustomPermission(PermissionState.None)
End If
End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
bool unrestricted = false;
public new bool Unrestricted
{
get{ return unrestricted; }
set{ unrestricted = value; }
}
public CustomPermissionAttribute(SecurityAction action): base (action)
{
}
public override IPermission CreatePermission()
{
if(Unrestricted)
{
return new CustomPermission(PermissionState.Unrestricted);
}
else
{
return new CustomPermission(PermissionState.None);
}
}
}
В данном случае CreatePermission проверяет внутреннее свойство Unrestricted и создает соответствующий экземпляр объекта CustomPermission. Хотя в данном случае используется только свойство Unrestricted, другие классы атрибутов пользовательских разрешений должны поддерживать все возможные состояния объектов разрешений, поддерживаемых ими.
Использование атрибута CustomPermissionAttribute проиллюстрировано следующим объявлением требования:
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
См. также
Основные понятия
Создание собственных разрешений доступа к коду
Реализация пользовательского разрешения